ReentrantLock的公平锁和非公平锁实现图解

公平锁的获取和释放:

ReentrantLock的公平锁和非公平锁实现图解_第1张图片
可以看到这个过程跟AQS独占锁的获取和释放是一样的,实现公平锁的关键是tryRelease方法的实现:
ReentrantLock的公平锁和非公平锁实现图解_第2张图片

公平锁实现关键:

当有资源时也会判断当前有没有线程在等待,只要有线程在等待不管有没有资源都要排队等待,这就保证了线程完全是按先后顺序执行。

可重入实现细节:

同一个线程可以在没有资源情况下无限次获取锁,通过上图可以看到,在state不是0的情况下会判断当前线程是否是持锁线程,是的情况下会改变state的值并return true。此时要注意,同一个线程lock几次,也要unlock几次,不然会死锁。

非公平锁的获取和释放:

ReentrantLock的公平锁和非公平锁实现图解_第3张图片

非公平锁有两次非公平的方式:

1.在刚调lock时会直接CAS尝试获取锁。
2.在nonfairTryAcquire方法中发现有资源的情况下会直接CAS尝试获取锁,而不会管等待队列中有没有其他线程在排队。

公平锁和非公平锁实现细节差异:

公平锁在有资源的情况下也会判断等待队列中是否有线程在等待,而非公平锁会有两次非公平获锁的机会,但如果失去这两次机会则也要乖乖的排队等候按时间顺序执行。

你可能感兴趣的:(多线程学习)