java公平和非公平锁_java重入锁、公平锁和非公平锁

锁的重入是指同一个线程可以多次获取同一个锁,synchronize是隐式的可重入锁,ReentrantLock通过代码实现了锁的重入:

final boolean nofairTryAcquire(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) throw new Error("Maximum lock count exceeded");

setState(nextc);

return true;

}

return false;

}

从上面的代码中,可以一目了然的发现,当获取锁的线程与拥有锁的线程是同一个线程时,仅会对状态进行累加。so easy ,并没有什么难度。那接下来我们想一下,如何实现公平所和非公平锁,上面的代码是非公平锁的实现方式。那如何实现公平锁那?所谓的公平锁就是所有获取锁的线程都要按照“先来后到”的顺序获取锁。假设线程B在阻塞队列中,等待获取锁,如果还有一个线程A在B的前面,那么B就要让A先获取锁。因此在B尝试获取锁之前,只要判断一下它是否还有前驱的队列即可。很easy吧:

final boolean fairTryAcquire(int acquires){

final Thread current=Thread.currentThread();

int c=getState();

if(c==0){

if(!hasQueuedPredecessors()&&compareAndSetState(0,acquires)){//判断是否有前驱线程等待获取锁

setExclusiveOwnerThread(current);

return true;

}

}else if(current==getExclusiveOwnerThread()){

int nextc=c+acquires;

if(nextc<0) throw new Error("Maximum lock count exceeded");

setState(nextc);

return true;

}

return false;

}

公平所和非公平锁的各自优势是什么那?公平锁很好理解,可以防止出现线程饥饿现象,每一个线程都有机会获取到锁。非公平锁可能会导致线程饥饿,但是我们一般使用非公平锁,因为非公平锁可以减少上下文的切换,提高效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值