Java锁之公平和非公平锁

Java锁之公平和非公平锁

目录

  1. 公平锁和非公平锁概念
  2. 公平锁和非公平锁区别
  3. ReentrantLock和synchronized是公平锁还是非公平锁?

1. 公平锁和非公平锁概念

  1. 公平锁:是指多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到。
  2. 非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,在高并发的情况下,有可能会造成优先级反转或者饥饿现象

2. 公平锁和非公平锁区别

  1. 公平锁:Threads acquire a fair lock in which they requested
  2. 公平锁:就是很公平,在并发坏境中.每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有锁.否则就会加入到等待队列中.以后会按照FIFO的规则从队列中取到自己。
  3. 非公平锁:a nonfair lock permis barging:threads requesting a lock can jump ahead of the queue of waiting threads if the lock
    happens to be available when it is requested.
  4. 非公平锁比较粗鲁,上来就直接尝试占有锁,如果尝试失败,就再采用类似公平锁那种方式。

3. ReentrantLock和synchronized是公平锁还是非公平锁?

  1. Java ReentrantLock 而言,通过构造函数指定该锁是否为公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。源码如下
 Lock lock = new ReentrantLock();

点进去源码截图:
《Java锁之公平和非公平锁》
默认为非公平锁,当我们传入true参数后,源码为

Lock lock = new ReentrantLock(true);

点进去源码为:
《Java锁之公平和非公平锁》

  1. 对于synchronized而言,也是一种非公平锁
    原文作者:娃哈哈、
    原文地址: https://blog.csdn.net/weixin_41910694/article/details/90612418
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞