1
90
但是,在地图上运行两个(或更多)操作必须在一个块中同步。 |
2
15
|
3
13
潜在的 查找代码中的细微错误。 更新: 因为他使用的是map.remove(),所以这个描述并不完全正确。我第一次错过了这个事实(感谢问题的作者指出这一点。我将其余部分保持原样,但将主要陈述改为有。) 虫子。] 嫁妆 您可以通过线程安全的方式从映射中获取列表值。但是,之后,您将在不安全的情况下访问该列表。例如,一个线程可能正在使用中的列表 synchronizedMap.get(键).add(值) . 这两个访问是不同步的。经验法则是集合的线程安全保证不会扩展到它们存储的键或值。 您可以通过在映射中插入一个同步列表来修复此问题,如
嫁妆 :
最后一个选项将稍微限制并发性,但在IMO中更加清晰。
最后一件事。:)这句伟大的引用自 Java并发编程实战 总是帮助我设计调试多线程程序。 |
4
11
是的,您正在正确同步。我将更详细地解释这一点。 只有在必须依赖synchronizedMap对象的方法调用序列中的后续方法调用中先前方法调用的结果的情况下,才能同步synchronizedMap对象上的两个或多个方法调用。
在此代码中
和
方法调用依赖于上一次调用的结果
方法调用。
例如
结果是“
相信
在这里
方法调用不依赖于上一次调用的结果
|
5
4
在我看来这是正确的。如果要更改任何内容,我将停止使用Collections.synchronizedMap(),并以相同的方式同步所有内容,以使其更清晰。 还有,我会替换
|
6
3
同步的方式是正确的。但有一个陷阱
A.它有一个API“putIfAbsent”,可以做同样的事情,但效率更高。
C您可能已经将map对象的引用传递到了代码库中的其他地方,而您/tean中的其他开发人员最终可能会错误地使用它。也就是说,他可以只添加()或get(),而不锁定地图的对象。因此,他的呼叫不会与您的同步块互斥。但是使用并发实现可以让您安心,因为它 不能被错误地使用/实施。 |
7
2
Google Collections
如果由于某种原因无法使用该库,请考虑使用
|