1.自旋锁:自旋锁会在抢不到cpu的时候一直去重试,如果我们可以保证在很短的时间就可以抢占到cpu的使用权,这种方式就可以便面我们sleep以后再启动带来的线程切换开销。
while(getLock(lock).isfail){
}
自旋锁的使用:下面这一段就是Unsafe的getAndAddInt方法,while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4))
这一行代码就是,如果修改数值失败则通过循环来执行自旋,直至修改成功。
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}
2.互斥锁:如果没有抢到cpu就sleep,等到过段时间以后重试。
while (getLock(lock).isfail) {
Thread.sleep();
}