Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java concurrentHashMap和hashtable中使用的锁定机制_Java - Fatal编程技术网

Java concurrentHashMap和hashtable中使用的锁定机制

Java concurrentHashMap和hashtable中使用的锁定机制,java,Java,这个问题最近在java采访中被问到。 我后来试图搜索,但找不到确切的答案。 如果有人有答案的链接,请告诉我。 我的问题是: ConcurrentHashMap和Hashtable是同步的。 但是它在锁定时的写入操作中使用了哪种锁定机制。ConcurrentHashMap的两个主要功能是: 在ConcurrentHashMap上写入时,只锁定映射的一部分 读取通常可以在不锁定的情况下进行 有可能同时有两个并行线程写入ConcurrentHashMap。根据ConcurrentHashMap的默

这个问题最近在java采访中被问到。 我后来试图搜索,但找不到确切的答案。 如果有人有答案的链接,请告诉我。 我的问题是:

ConcurrentHashMap和Hashtable是同步的。
但是它在锁定时的写入操作中使用了哪种锁定机制。

ConcurrentHashMap的两个主要功能是:

  • 在ConcurrentHashMap上写入时,只锁定映射的一部分
  • 读取通常可以在不锁定的情况下进行

有可能同时有两个并行线程写入ConcurrentHashMap。根据ConcurrentHashMap的默认实现,atmost 16线程可以并行写入和读取。但最糟糕的情况是,如果这两个对象位于ConcurrentHashMap的同一段或分区中,那么并行写入就不可能了。

开源的好处是,您只需查找即可!特别相关


ConcurrentHashMap中的并发性相当复杂-它将内容分成
s以避免锁定整个表,并使用
volatile
字段来允许无锁并发读取。

ConcurrentHashMap使用内部将存储桶划分为段,一个特定段可以由线程锁定以用于写入

Segment只不过是一个静态类,它是哈希表的专用版本,并实现Reentrantlock以简化锁定

static class Segment<K,V> extends ReentrantLock implements Serializable {
        private static final long serialVersionUID = 2249069246763182397L;
        final float loadFactor;
        Segment(float lf) { this.loadFactor = lf; }
}
静态类段扩展ReentrantLock实现可序列化{
私有静态最终长serialVersionUID=22490692467636182397L;
最终浮动载荷系数;
段(float lf){this.loadFactor=lf;}
}

Segments的构造函数调用ReentrantLock的no arg构造函数并创建一个非公平锁。

这在这些类的Javadoc类注释中进行了解释。希望这会有所帮助:[concurrenthashmap和hashtable][1][1]:但在内部锁定段时使用了哪种锁定技术?