【发布时间】:2022-01-01 15:00:52
【问题描述】:
如果两个线程同时将 val 放入一棵树中
private final void contendedLock() {
boolean waiting = false;
for (int s;;) {
if (((s = lockState) & ~WAITER) == 0) {
if (U.compareAndSwapInt(this, LOCKSTATE, s, WRITER)) {
if (waiting)
waiter = null;
return;
}
}
else if ((s & WAITER) == 0) {
if (U.compareAndSwapInt(this, LOCKSTATE, s, s | WAITER)) {
waiting = true;
waiter = Thread.currentThread();
}
}
else if (waiting)
LockSupport.park(this);
}
}
Thread1:CAS 将锁状态写入 WRITER
Thread2:CAS 锁定状态到 (WRITER|WAITER)
Thread2:LockSupport.park(this)
Thread1:unlockRoot
private final void unlockRoot() {
lockState = 0;
}
那么谁能解除 Thread2 的停放?
find()方法的finally部分需要在严格的条件下完成
finally {
Thread w;
if (U.getAndAddInt(this, LOCKSTATE, -READER) ==
(READER|WAITER) && (w = waiter) != null)
LockSupport.unpark(w);
}
如果我想错了,谁能告诉我?
【问题讨论】:
标签: java java.util.concurrent concurrenthashmap