Поскольку я использовал метод tryLock()
в одном из моих проектов, при использовании того же самого вопроса, поразительный ум заключается в том, что - tryLock()
называется неблокирующим механизмом, как ему удается получить блокировку безблокировка.
Может быть два сценария
- Он не использует
synchronized
блок / метод внутри, тогда вопрос в том, как он работает в многопоточной среде - Он использует
synchronized
block / method для внутреннего использования, тогда возникает вопрос, как это неблокирует
Чтобы найти ответ, я проверил приведенный ниже код для tryLock
public boolean tryLock() {
return sync.nonfairTryAcquire(1);
}
И здесь идет код для sync.nonfairTryAcquire(1)
, который фактически выполняет работу
final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
Поскольку кажется, что код для tryLock()
нигде не использует synchronized
, как это работает в многопоточной среде?