Linux系统中自旋锁的原理和实现想当复杂,会涉及操作系统、内核等等一系列的东东,Java的自旋锁可以理解成让当前线程不停地在循环体内执行,直到满足线程进入临界区为止。
在AbstractQueuedSynchronizer中就有自旋锁的使用,参见 acquireQueued方法
final boolean acquireQueued(final Node
node, int arg) {
try {
boolean interrupted
= false;
for (;;)
{
final Node
p = node.predecessor();
if (p
== head && tryAcquire(arg)) {
setHead(node);
p.next = null; //
help GC
return interrupted;
}
if (shouldParkAfterFailedAcquire(p,
node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} catch (RuntimeException
ex) {
cancelAcquire(node);
throw ex;
}
}
这里的for循环就可以理解成一个自旋锁的简单实例,某个线程获取锁时,会在这个方法中不断地阻塞-唤醒-阻塞……进行执行,直到这个线程获得了锁,才算完成。