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