Java “ConcurrentHashMap不能被锁定以进行独占访问”这句话是什么意思?

Java “ConcurrentHashMap不能被锁定以进行独占访问”这句话是什么意思?,java,Java,Joshua Block及其合著者对著名的Java Concurrency在实践中提出- 这是第5章的构建块- …因为ConcurrentHashMap不能锁定为独占 访问 据我所知,独占访问是指在操作期间锁定整个集合,每个线程都持有一个锁,以使其原子化 ConcurrentHashMap< String, String> map = new ConcurrentHashMap< String, String>(); public void getExc

Joshua Block及其合著者对著名的Java Concurrency在实践中提出-

这是第5章的构建块-

…因为ConcurrentHashMap不能锁定为独占 访问

据我所知,独占访问是指在操作期间锁定整个集合,每个线程都持有一个锁,以使其原子化

    ConcurrentHashMap< String, String> map = new ConcurrentHashMap< String, String>();

    public void getExclusiveAccess(){
        synchronized (map) {
            //....
        }
    }
ConcurrentHashMapmap=newconcurrenthashmap();
public void getExclusiveAccess(){
同步(地图){
//....
}
}
尽管这样做是愚蠢的,但通过同样的方式显然可以实现独占访问。
请建议。
为什么作者说不能为独占访问锁定ConcurrentHashMap

显然,通过相同的方法可以实现独占访问

如果其他代码在同步块之外使用映射,则不会这样做(这是完全可以接受的)


这不同于,比如说,一个
synchronizedMap
,其中所有的方法都在地图上同步-因此,如果你在这样一个地图上
synchronized(map){…}
,你实际上拥有独占访问权。

我已经这样做了,但是这是可以实现的,它仅与此外部锁定一起使用,
ConcurrentMap
不支持它。如果您在任何地方访问地图而不使用此同步,它将不是独占的。如果您在任何地方使用synchronized,它就不再是并发的


唯一有意义的是,如果您需要独占写入而不是独占读取。

但我只讨论我显然拥有独占访问权限的情况。
synchronized(map){/..}
甚至可以保证这种情况下的独占访问。@ShirgillFarhanAnsari CHM实现本身不支持独占访问。当然,现在您可以通过使用客户端锁定来强制独占访问。。。但这与
Collections.synchronizedMap()
非常不同,后者在实现级别提供独占访问。这显然是客户端锁定。那么,为什么作者提到了-既然ConcurrentHashMap不能被锁定以进行独占访问,我们就不能使用客户端锁定来创建新的原子操作,例如put。如果没有,我知道在并发映射中已经有原子操作来做同样的操作。@ShirgillFarhanAnsari ConcurrentMap不支持这一点,这并不妨碍您实现自己的解决方案,但在实现过程中您不会得到任何支持。我认为此示例代码将有助于:,理解Peter/本书作者想要传达的内容。