当涉及到多线程系统的队列实现时,我已经经历了一些惊喜。这里是: -同步vs ReentrantLock的性能
场景: - 1个生产者,1个消费者: - 生产者将一个整数放入队列中。消费者只需将其从队列中移除即可。
队列的底层数据结构: - TreeSet中(但决没有想到我将使用),链表,的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和Array结构?
2)同步出来作为一个明确的胜利者与ReeentrantLock,因为TreeSet执行比LinkedList更好,比LinkedBlockingQueue表现更好。我希望我可以附加Visual VM结果。这是不符合文章票,http://www.ibm.com/developerworks/java/library/j-jtp10264/index.html
的操作是在
戴尔Vostro 1015进行的Core 2 Duo 2.10,2GB内存与32位操作系统,并与
JVM:Java的热点( TM)客户端VM(20.1-B02,混合模式) 的Java:版本1.6.0_26,供应商Sun微系统公司
这几乎是我在我的问题中附加链接的同一个例子。它告诉我REL的性能比2线程开始的同步要好。另外我觉得,如果我有办法强制OS调度程序在所有可用的CPU上运行线程,我们肯定会获得更好的LinkedBlockingQueues性能。如果你需要我的观察数据,请告诉我。 – 100pipers 2012-07-22 13:55:04
库马尔忘记提及他从[David Dice的博客](https://blogs.oracle.com/dave/entry/java_util_concurrent_reentrantlock_vs)中回答了他的答案。 – 2013-06-17 05:46:07
@AlexanderRyzhov感谢让我指向本文的原作者,因为当我从其他博客为我的scjp做准备时阅读此内容...非常感谢您 – 2013-06-17 05:55:19