java – ConcurrentHashMap是否需要包装在同步块中?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – ConcurrentHashMap是否需要包装在同步块中?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1401字,纯文字阅读大概需要3分钟。
内容图文
![java – ConcurrentHashMap是否需要包装在同步块中?](/upload/InfoBanner/zyjiaocheng/702/286dd7cadc9f4a1488c9fc3c38a67115.jpg)
ConcurrentHashMap(put(),remove()等)上的所有非retreival操作是否需要包装在synchronized(this)块中?我知道所有这些操作都是线程安全的,所以这样做有什么好处/需要吗?使用的唯一操作是put()和remove().
protected final Map<String, String> mapDataStore = new ConcurrentHashMap<String, String>();
public void updateDataStore(final String key, final String value) {
...
synchronized (this) {
mapDataStore.put(key, value);
}
...
}
解决方法:
不,你这样做会失去ConcurrentHashMap的好处.您也可以使用带有synchronized或synchronizedMap()的HashMap来锁定整个表(这是您在synchronized中包装操作时所执行的操作,因为监视器隐含的是整个对象实例.)
ConcurrentHashMap的目的是通过允许对表进行并发读/写而不锁定整个表来增加并发代码的吞吐量.该表通过使用锁定条带内部支持这一点(多个锁而不是一个,每个锁分配给一组散列桶 – 参见Goetz等人的Java Concurrency in Practice).
一旦你使用ConcurrentHashMap,所有标准的map方法(put(),remove()等)都会因为实现中的锁条带等而变为原子.唯一的权衡是像size()和isEmpty()这样的方法可能不一定会返回准确的结果,因为它们可能是所有操作锁定整个表的唯一方法.
ConcurrentMap interface接口还添加了新的原子复合操作,如putIfAbsent()(仅当键不在映射中时才放置东西),remove()接受键和值(仅当条目的值等于您传递的参数时才删除条目这些操作过去需要锁定整个表,因为它们需要两个方法调用来完成(例如putIfAbsent()需要调用containsKey()和put(),包含在一个synchronized块中,如果你使用的话标准Map实现.)再一次,通过避免锁定整个表,您可以使用这些方法获得更大的吞吐量.
内容总结
以上是互联网集市为您收集整理的java – ConcurrentHashMap是否需要包装在同步块中?全部内容,希望文章能够帮你解决java – ConcurrentHashMap是否需要包装在同步块中?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。