java同步读写,关于java:Collections中的synchronizedMap方法是否同步读写操作

本问题已经有最佳答案,请猛点这里访问。

当我做一个收藏.同步DMAP(Somehashmap)时,所有的都可以进入同步地图吗?还是只写同步操作?如果从地图上读到两条线怎么办?威尔是同步的吗?似乎有必要如果一个螺纹被放置()而另一个螺纹被放置(),该怎么办?

因为Collections.synchronizedMap非常基本,几乎不能使用。还有用于更严重的并发使用的ConcurrentHashMap。

看一下包装您的Map的SynchronizedMap的源代码。

...

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

public static Map synchronizedMap(Map 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*方法不是设计为最佳的线程安全版本/实现。他们只是为了方便。

同步是一个困难的问题,通常需要根据您的特定场景使用不同的同步方法。如果您需要其他类型的线程安全性,那么还有许多其他的线程安全集合可用。您也可以自己编写同步逻辑。

读和写都是同步的,这是确保可见性所必需的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值