公平锁与非公平锁

如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁

公平锁内部维护了一个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();
            }
        }
    }
}

现象:公平锁基本上每个线程都能执行一次,而非公平锁存在大量饿死线程

 

https://www.jianshu.com/p/eaea337c5e5b

posted @ 2020-03-15 16:52  何浩源  阅读(289)  评论(0)    收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中