公平锁源码: alt

alt

非公平锁的源码:

alt

为了看这个tryacquire:

alt

第一:非公平锁获取锁的方式,如果资源是可用的,那么非公平锁上来就先试着cas改变资源的占用;失败了就调用acquire;但是公平锁不会抢着获取;

第二个:在tryAcquire尝试获得资源的时候,产生差异;非公平锁尝试获得资源的可用,使用cas尝试;但是公平锁会先判断队列里面有没有其他线程;没有再尝试获得其他线程;有人就直接排队

非公平锁相比公平锁会多两次机会去抢锁;

优缺点:

非公平锁:效率低,即使队列里面有线程,那么也有可能抢到;

公平锁:效率低,但是能保证线程执行的顺序;因为他不会产生争抢;