Я прошел через несколько неожиданностей, когда дело доходит до реализации Queue для многопоточной системы. Вот: -
Сценарий: - 1 производитель, 1 потребитель: - Производитель помещает целое число в очередь. Пользователь просто удаляет его из очереди.
Основная структура данных очереди: - TreeSet (который я никогда не думал использовать), LinkedList, LinkedBlockingQueue (с неопределенным размером)
Код: - TreeSet как очередь: -
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();
}
}
Для 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();
}
}
Для LinkedList: - аналогичный код с синхронизированным.
Вопросы: -
1) Когда я измерил производительность через визуальную виртуальную машину, я заметил, что для кода производителя TreeSet работает лучше, чем LinkedBlockingQueue и LinkedList, хотя для этого требуется время O (log n), создание объектов в связанных структурах значительные накладные расходы. Почему теория отличается от практики? Почему мы предпочитаем связывать структуры массива над структурами дерева в реализациях очереди?
2) Синхронизированный выдается как явный выигрыш против ReeentrantLock, потому что TreeSet работает лучше, чем LinkedList, который работает лучше, чем LinkedBlockingQueue. Я хотел бы приложить результаты Visual VM. Это не в голосах со статьей, http://www.ibm.com/developerworks/java/library/j-jtp10264/index.html
Операции выполняются на
Dell Vostro 1015, Core 2 Duo 2.10, 2GB Ram с 32-разрядной операционной системой и
JVM: виртуальная машина клиента HotSpot (TM) Java (20.1-b02, смешанный режим) Java: версия 1.6.0_26, поставщик Sun Microsystems Inc.