站长数据,wordpress分享缩略图,seo挂机赚钱,长春大型互联网公司首先来看公平锁和非公平锁#xff0c;我们默认使用的锁是非公平锁#xff0c;只有当我们显示设置为公平锁的情况下#xff0c;才会使用公平锁#xff0c;下面我们简单看一下公平锁的源码#xff0c;如果等待队列中没有节点在等待#xff0c;则占有锁#xff0c;如果已经…首先来看公平锁和非公平锁我们默认使用的锁是非公平锁只有当我们显示设置为公平锁的情况下才会使用公平锁下面我们简单看一下公平锁的源码如果等待队列中没有节点在等待则占有锁如果已经存在等待节点则返回失败由后面的程序去将此线程加入等待队列通过上面的代码我们可以推断当使用公平锁的情况下并且同一个线程的执行时间较长时线程内部进行了多次的锁的获取和释放效率非常低下可以参加Lesson8中的demodemo Lesson8LockIntPerform:在使用ReentrantLock加非公平锁的情况下100个线程循环下单数为857239882demo Lesson8LockIntPerform:在使用ReentrantLock加非公平锁的情况下100个线程循环下单数为860364303demo Lesson8LockFairIntPerform:在使用ReentrantLock加公平锁的情况下100个线程循环下单数为19153640demo Lesson8LockFairIntPerform:在使用ReentrantLock加公平锁的情况下100个线程循环下单数为19076567上面的demo中在使用公平锁的情况下性能明显降低非公平锁的性能是公平锁性能的几十倍以上这和公平锁每次试图占有锁时都必须先要进等待队列按照FIFO的顺序去获取锁因此在我们的实验情景下使用公平锁的线程进行了频繁切换而频繁切换线程性能必然会下降的厉害这也告诫了我们在实际的开发过程中在需要使用公平锁的情景下务必要考虑线程的切换频率。接下来我们来看一下读写锁通过看读写锁的实现源码我们可以发现读锁和写锁共用同一个等待队列那么在采用非公平锁的情况下如果读锁的线程执行时间比较长并且读锁的并发比较高那么写锁的线程便永远都拿不到锁那么实际的情况会不会是这样呢demo Lesson3WriteReadLock:此demo的读线程在不断的占用读锁按照推论写锁的线程是没有机会获取到锁的但是实际情况是写锁的线程可以正常的获取到锁那么是什么原因使得写锁的线程可以获取到锁的了通过查看源代码会发现有这样的一个方法上面的方法实现了一个新的读线程获取锁的中断它会读取等待队列中下一个等待锁的线程如果它是获取写锁的线程那么此方法返回为真调用它的程序会把这个试图获取读锁的线程加入到等待队列从而终止了读线程一直都在占有锁的情况。