公平锁与非公平锁
如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁
公平锁内部维护了一个FIFO队列,按照先入先出的顺序获得锁,而非公平锁存在抢占锁的现象
在公平的锁中,如果有另一个线程持有锁或者有其他线程在等待队列中等待这个锁,那么新发出的请求的线程将被放入到队列中。而非公平锁上,只有当锁被某个线程持有时,新发出请求的线程才会被放入队列中(此时和公平锁是一样的)。所以,它们的差别在于非公平锁会有更多的机会去抢占锁。
Lock lock = new ReentrantLock(false);
由于cpu时间片段的切换,从恢复一个线程被挂起到重新执行的过程中,会存在较大延迟,这样的话,非公平锁能够尽量利用cpu空闲的时间片段
但是,当一个业务中,执行业务的时间远大于线程等待的时间时,那么使用非公平锁的性能并不是很明显,反而使用公平锁能够加强对程序的可控性
public class hhy { static Lock lock = new ReentrantLock(true); public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(new hhy.hhyuan(i)).start(); } } static class hhyuan implements Runnable{ Integer id; public hhyuan(Integer id) { this.id = id; } @Override public void run() { for (int i = 0; i < 3; i++) { lock.lock(); System.out.println("获取锁的线程是"+id); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } lock.unlock(); } } } }
现象:公平锁基本上每个线程都能执行一次,而非公平锁存在大量饿死线程

浙公网安备 33010602011771号