Joshua Block&共同作者着名的 Java Concurrentcy In Practice 提出了 -
这是来自第5章构建模块 -
...由于ConcurrentHashMap无法为独占锁定 访问.....
我所理解的是,独占访问是指锁定整个集合,每个线程在操作期间持有一个锁,使其成为原子。
ConcurrentHashMap< String, String> map = new ConcurrentHashMap< String, String>();
public void getExclusiveAccess(){
synchronized (map) {
//....
}
}
尽管做上述事情会是愚蠢的,但显然可以通过相同的方式实现独家访问。
请建议。
为什么作者说一个ConcurrentHashMap无法锁定以进行独占访问?
答案 0 :(得分:2)
我已经完成了这个并且它可以实现,但它只适用于这个外部锁定,ConcurrentMap
不支持。如果您在不使用此同步的情况下在任何地方访问地图,它就不会是独占的。如果你在任何地方使用同步它不再是并发的。
唯一可能有意义的是,如果您需要独占写入而非独占读取。
答案 1 :(得分:1)
显然可以通过相同的
实现独占访问
如果其他代码使用同步块之外的地图(这是完全可以接受的),则不行。
这与synchronizedMap
不同,其中所有方法都在地图上自动同步 - 因此,如果您在此类地图上synchronized(map) {... }
,则您实际上拥有独占访问权。