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循环就可以理解成一个自旋锁的简单实例,某个线程获取锁时,会在这个方法中不断地阻塞-唤醒-阻塞……进行执行,直到这个线程获得了锁,才算完成。