synchronized
ミューテックスのようなものを扱うためにJavaで使用されます。ただし、 Java のLock
ようなインターフェースの実装ではReentrantLock
、このキーワードは使用されません。すべてのコードは通常のコードに見えます。では、地球上の複数のスレッドをどのように処理するのでしょうか?
次のコードが関連していると思います。
のtryAcquire
メソッドSync
_ReentrantLock
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (!hasQueuedPredecessors() &&
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
Sync
extendsAbstractQueuedSynchronizer
と関連するコード:
final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null; // help GC
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}
キーワードが使用されていないsynchronized
ようですが、どのようにミューテックスを保証しますか?