synchronized
используется в Java для работы с мьютексом. Однако реализации интерфейса Lock
, такие как ReentrantLock
в Java не использует это ключевое слово. Весь код выглядит просто нормальным кодом. Тогда как он обрабатывает несколько потоков на земле?Почему в реализации блокировки Java нет синхронизированного ключевого слова?
Я считаю, что следующие части коды связаны:
Метод 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
расширяет AbstractQueuedSynchronizer
и связанный код:
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
используется, тогда как он гарантирует немой Икс?
Yea. Нашел его, и у него есть родное ключевое слово. Значит, соответствующий код на самом деле не java? – NSF
Это код, в котором написана JVM. Для Oracle это C++, для IBM это сама Java :-) – Sebastian
Gotcha. Благодарю. – NSF