Does the synchronizedMap method in Collections synchronize both read and write operations
当我做一个收藏.同步DMAP(Somehashmap)时,所有的都可以进入同步地图吗?还是只写同步操作?如果从地图上读到两条线怎么办?威尔是同步的吗?似乎有必要如果一个螺纹被放置()而另一个螺纹被放置(),该怎么办?
- 因为Collections.synchronizedMap非常基本,几乎不能使用。还有用于更严重的并发使用的ConcurrentHashMap。
看一下包装您的Map的SynchronizedMap的源代码。
1 2 3 4 5 6 7 8 9 10 11 12
| ...
public V get (Object key ) {
synchronized (mutex ) {return m. get(key );}
}
public V put (K key, V value ) {
synchronized (mutex ) {return m. put(key, value );}
}
public V remove (Object key ) {
synchronized (mutex ) {return m. remove(key );}
}
... // more methods synchronized in the same way |
从
1 2 3
| public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
return new SynchronizedMap<>(m);
} |
所以,是的,所有访问都是同步的。
- 但不幸的是,读写在内部互斥体上是同步的,这使得外部代码在持有锁的同时无法在实体上迭代。编辑:Sotirios和Affe是正确的,我的评论应该被忽略。
- JavaDoc就是这么说的:It is imperative that the user manually synchronize on the returned map when iterating over any of its collection views:...
- 互斥体实际上就是"this",它的编写方式很简单。同步映射以使其正常迭代。
- 代码在mutex而不是直接在this上同步的原因是代码与SynchronizedSortedMap共享,需要支持返回在父映射上同步的子映射。见Collections.SynchronizedSortedMap.subMap。
- @我知道,我只是说明了为什么这些方法不是以public synchronized someMethod...的形式编写的。它不仅仅是惯用的,它是为了支持返回通过synchronizedMap的第二个构造函数在父映射上同步的synchronizedMap。
- @增量1误解了您的评论。意味着方法是同步的。
- @Sotiriosdelimanolis不用担心,我实际上是在回应affe的评论(关于mutex的使用是惯用的),我应该恰当地回答我的评论。
是的,它同步所有操作。它不使用多个读卡器、单写程序的方法——它就像通过一个监视器同步所有访问一样简单。
集合上的所有方法调用都已同步。一次只允许一个线程读取/修改集合。
集合中的synchronized*方法不是设计为最佳的线程安全版本/实现。他们只是为了方便。
同步是一个困难的问题,通常需要根据您的特定场景使用不同的同步方法。如果您需要其他类型的线程安全性,那么还有许多其他的线程安全集合可用。您也可以自己编写同步逻辑。
读和写都是同步的,这是确保可见性所必需的。