Przeszedłem przez zestaw kilku niespodzianek, jeśli chodzi o wdrażanie Kolejki dla systemu wielowątkowego. Oto: -Zsynchronizowany z ReentrantLock na wydajności
Scenariusz: - 1 producent, 1 konsument: - Producent wstawia liczbę całkowitą do kolejki. Konsument po prostu usuwa go z kolejki.
Podstawową strukturą danych z kolejki: - TreeSet (które nigdy nie myślałem, że będę używał), LinkedList, LinkedBlockingQueue (o nieokreślonej wielkości)
Kod: - z TreeSet jako kolejki: -
while (i < 2000000) {
synchronized (objQueue) {
if (!(objQueue.size() > 0)) {
try {
objQueue.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Integer x = objQueue.first();
if (x != null) {
objQueue.remove(x);
++i;
}
}
}
EDIT: -
while (i < 2000000) {
synchronized (objQueue) {
objQueue.add(i);
++i;
objQueue.notify();
}
}
Dla LinkedBlockingQueue: -
while (i < 2000000){
try {
objQueue.put(i);
++i;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Thread.currentThread().interrupt();
}
}
while (i < 2000000) {
try {
objQueue.take();
++i;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Thread.currentThread().interrupt();
}
}
Dla LinkedList: - podobny kod zsynchronizowany.
następujące pytania: -
1) Gdy mierzono wydajność poprzez Wizualnej VM, to obserwuje się, że do kodu producenta, TreeSet działa lepiej niż LinkedBlockingQueue i LinkedList, mimo że zajmuje O (log n) , tworzenie obiektów w strukturach Powiązanych jest znacznym obciążeniem. Dlaczego teoria różni się od praktyki? Dlaczego preferujemy struktury Połączone, Macierzowe nad strukturami Drzew w implementacjach kolejkowych?
2) Zsynchronizowany jest wyraźnym zwycięzcą w stosunku do ReeentrantLock, ponieważ TreeSet działał lepiej niż LinkedList, który działał lepiej niż LinkedBlockingQueue. Chciałbym móc dołączyć wyniki Visual VM. To nie jest w głosami artykule http://www.ibm.com/developerworks/java/library/j-jtp10264/index.html
operacje są wykonywane na
Dell Vostro 1015, Core 2 Duo 2.10, 2GB RAM z 32-bitowym systemem operacyjnym iz
JVM: Java HotSpot (TM) Client VM (20,1-B02, tryb mieszany) Java: wersja 1.6.0_26, sprzedawca Sun Microsystems Inc.
To prawie ten sam przykład, do którego dołączyłem link w moim pytaniu. Mówi mi, że wydajność REL jest lepsza niż synchronizacja zaczynająca się od 2 wątków. Czuję też, że jeśli uda mi się zmusić program planujący OS do uruchamiania wątków na wszystkich dostępnych procesorach, zdecydowanie poprawimy wydajność dla LinkedBlockingQueues. Jeśli potrzebujesz moich danych obserwacji, daj mi znać. – 100pipers
Kumar zapomniał wspomnieć, że wziął odpowiedź od [Weblog Davida Dice'a] (https://blogs.oracle.com/dave/entry/java_util_concurrent_reentrantlock_vs). –
@AlexanderRyzhov dziękuję za pozwolenie mi wskazać oryginalnego autora tego artykułu, jak to przeczytałem, podczas gdy przygotowywałam się do mojego scjp z innych blogów ... bardzo dziękuję –