我正在阅读ConcurrentHashMapJDK8中的源代码,请注意,该代码TreeBin使用“读写”锁来防止并发读写。
如果没有并发的写线程试图修改树结构,则读线程将通过TreeNodes。当“查找”操作完成时,读取线程可能会:
(1)lockState如果存在,则“ CAS” 和“取消”服务线程。
以下是源代码中的“ find()”方法。
final Node<K,V> find(int h, Object k) {
if (k != null) {
for (Node<K,V> e = first; e != null; ) {
int s; K ek;
if (((s = lockState) & (WAITER|WRITER)) != 0) {
if (e.hash == h &&
((ek = e.key) == k || (ek != null && k.equals(ek))))
return e;
e = e.next;
}
else if (U.compareAndSwapInt(this, LOCKSTATE, s,
s + READER)) {
TreeNode<K,V> …Run Code Online (Sandbox Code Playgroud)