在java的锁机制中,公平和非公平的参考物是什么,我的而言以为是相对产生的结果而立,
简单的来讲,若是一个线程组里,能保证每一个线程都能拿到锁,那么这个锁就是公平锁。
相反,若是保证不了每一个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁。java
本文围绕ReenTrantLock来说。web
那如何能保证每一个线程都能拿到锁呢,队列FIFO是一个完美的解决方案,也就是先进先出,java的ReenTrantLock也就是用队列实现的公平锁和非公平锁。
在公平的锁中,若是有另外一个线程持有锁或者有其余线程在等待队列中等待这个所,那么新发出的请求的线程将被放入到队列中。
而非公平锁上,只有当锁被某个线程持有时,新发出请求的线程才会被放入队列中(此时和公平锁是同样的)。
因此,它们的差异在于非公平锁会有更多的机会去抢占锁。ui
final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } }
hasQueuedPredecessors的实现线程
public final boolean hasQueuedPredecessors() { Node t = tail; // Read fields in reverse initialization order Node h = head; Node s; return h != t && ((s = h.next) == null || s.thread != Thread.currentThread()); }
final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } }
本文由猿必过 YBG 发布