gpt4 book ai didi

java - 性能上的同步 vs ReentrantLock

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:39 25 4
gpt4 key购买 nike

当涉及到多线程系统的队列实现时,我经历了一些惊喜。这是:-

场景:-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 :- 与 synchronized 类似的代码。

问题:-

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.

最佳答案

1. 如果您需要实现一个遍历链表的线程,锁定下一个节点然后解锁下一个节点,则ReentrantLock 可能更适合使用当前节点。

2. Synchronized 关键字适用于锁粗化等情况,提供自适应旋转、偏向锁和通过逃逸分析进行锁省略的可能性 .目前尚未为 ReentrantLock 实现这些优化。

要进行适当的性能比较,请参见:

https://web.archive.org/web/20201022183359/https://blogs.oracle.com/dave/javautilconcurrent-reentrantlock-vs-synchronized-which-should-you-use

关于java - 性能上的同步 vs ReentrantLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11600520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com