Создание простой TTAS (тест, тест и набор) спин-блокировки довольно тривиально:
class TTASLock {
private final AtomicLong thread = new AtomicLong();
void lock() {
while (true) {
if (thread.get() == 0) { // test
if (thread.compareAndSet(0, Thread.currentThread().getId())) // testAndSet
return;
}
}
}
void unlock() {
thread.compareAndSet(Thread.currentThread().getId(), 0)
}
}
Это очень простая спин-блокировка.Парадигма test, test и set не является строго обязательной для логического процесса, но является критически важным улучшением производительности, так что в условиях конкуренции поток, ожидающий получения блокировки, не будет постоянно аннулировать строку кэша Level2 с ошибочными операциями CAS.