在多线程系统的队列实现方面,我遇到了一些惊喜。这是:-
场景:- 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;
}
}
}
编辑:-
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) 当我通过 Visual VM 测量性能时,我观察到对于生产者代码,TreeSet 的性能优于 LinkedBlockingQueue 和 LinkedList,即使它需要 O(log n) 时间,但在 Linked 结构中创建对象是一个很大的开销. 为什么理论与实践大相径庭?为什么在队列实现中我们更喜欢链接的数组结构而不是树结构?
2) synchronized 与 ReeentrantLock 相比明显胜出,因为 TreeSet 的性能优于 LinkedList,而 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:Java HotSpot(TM) 客户端 VM(20.1-b02,混合模式) Java:版本 1.6.0_26,供应商 Sun Microsystems Inc.