脚本宝典收集整理的这篇文章主要介绍了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; }
公平所和非公平锁的各自优势是什么那?公平锁很好理解,可以防止出现线程饥饿现象,每一个线程都有机会获取到锁。非公平锁可能会导致线程饥饿,但是我们一般使用非公平锁,因为非公平锁可以减少上下文的切换,提高效率。
以上是脚本宝典为你收集整理的java重入锁、公平锁和非公平锁全部内容,希望文章能够帮你解决java重入锁、公平锁和非公平锁所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。