首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要锁定线程安全集合?

为什么要锁定线程安全集合?
EN

Stack Overflow用户
提问于 2014-02-02 02:24:26
回答 1查看 309关注 0票数 2

java.util.concurrent提供了许多线程安全集合,如ConcurrentHashMapConcurrentSkipListMapConcurrentSkipListSetConcurrentLinkedQueue。这些集合被认为是通过允许并发访问数据结构的不同部分来最小化争用。

Java还具有同步包装器,允许并发访问非线程安全集合,如HashMapArraylist

代码语言:javascript
复制
Map<KeyType, ValType> m = Collections.synchronizedMap(new HashMap<KeyType, ValType>());

在处理这些线程安全集合时,我们还需要执行客户端锁定吗?尤其是,在对它们进行迭代时?

代码语言:javascript
复制
 Set<KeyType> s = m.keySet();  
 synchronized(m) {
     for (KeyType k : s)
         foo(k); 
 }

在这种情况下,是否只为某些类型的操作提供线程安全?

有没有办法在不使用同步的情况下提供线程安全的集合?我熟悉volatile关键字,它可能与非原子操作的原始值一起使用。

EN

回答 1

Stack Overflow用户

发布于 2014-02-02 02:44:10

1)是的,您需要在迭代时执行客户端锁定,但大多数其他方法不需要您这样做。请参考Explain synchronization of collections when iterators are used?

2)所以对你的第二个问题的回答会自动变成是。您可以在文档中查看哪些操作是线程安全的(大多数都是)。

3)关于不使用同步的线程安全收集:这听起来可能是一项困难的任务,对于开发平台的专业开发人员团队来说应该很容易。但在现实中,在多核环境和积极优化的时代,这是一场噩梦。在功能(听起来可能就像这里这么简单)和性能(处理器缓存中的同步需要大量时间)之间总是存在权衡。请参考Angelica Langer的video (基于java内存模型)。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21501808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档