gpt4 book ai didi

java - 同步集合上的同步->性能问题

转载 作者:行者123 更新时间:2023-11-30 04:48:19 25 4
gpt4 key购买 nike

基于以下答案:我仍然不清楚:concurrentMap 上的同步构造有什么作用(如果有的话)。即,在并发映射的情况下,同步(映射)与非同步之间有什么区别(如果有的话)。 我对解决方案的正确性或可信的优点不感兴趣。只是对问题的回答:问:在并发映射上同步和不同步有什么区别?特别是在性能方面..就足够了。请不要再多了。
我只对发生的事情感兴趣,没有补充建议。

我有一个理论问题,我正在解决一些心理问题:假设我有一个并发集合类 say=>ConcurrentHashMap map;

假设我有三种方法:

method1: synchronized(map){
doSomethingWithThemap(); //Assume put integers 1.. 1000000
}

method2:doSomethingWithThemap(); //Note it is not synchronized
method3:doSomethingElseWithThemap(); //Assume put integers 2000000.. 3000000

现在假设 2 个测试用例:

<小时/>
  • 测试用例1:生成两个线程A和B。A调用方法1,B调用方法3。
  • TestCase2:生成两个线程 A' 和 B'。 A'调用方法2,B'调用方法3。

从性能的角度来看,我希望 TestCase2 获胜,因为据我了解,在 TestCase1 中,B 无法添加到映射,尽管是并发的,因为同步块(synchronized block)将持有映射上的锁,而这不是TestCase2 中的案例。

我的单元测试没有验证这个假设。

问:我在这里缺少什么。即,给定并发集合上的同步块(synchronized block),性能是否会受到影响?

最佳答案

Q: What am I missing here.

您关于 ConcurrentHashMap 内部同步自身的假设是不正确的:根据 the source code ,该实现使用 java.util.concurrent.locks 对象,其实例隐藏在集合中,因此您无法锁定/同步它们。

一般来说,这是类库编写者应该遵循的建议:如果需要在对象上同步,请不要在 this 上同步;在类中创建一个私有(private)对象,然后在该对象上进行同步。否则,您可能会面临其他人在您的对象上进行同步并无限期持有锁而导致的并发问题。

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

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