JUC:公平锁和非公平锁

什么是公平锁和非公平锁

公平锁:
当一个线程想要去获取锁时,发现该锁已经被另一个线程占用,那么该线程就要放入一个FIFO等待队列中等待,当持有锁的线程使用完时释放锁后,再根据队列的先后顺序唤醒一个线程去持有锁。即线程持有锁的顺序要讲先来后到,不能插队。

非公平锁:
当一个线程想要去获取锁时,发现该锁已经被另一个线程占用,那么该线程就试图去获取锁,如果获取成功就持有锁,获取失败就回到等待队列当中等待。指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。在高并发的情况下,有可能会造成优先级反转或者饥饿现象

并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,默认是非公平锁

//ReentrantLock的无参构造
 public ReentrantLock() {
        sync = new NonfairSync();
    }
 //ReentrantLock的有参构造
  public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

ReentrantLock锁在默认情况下是非公平锁,再创建的时候传入true可以创建一个公平锁。
而Synchronized是一个非公平锁。

公平锁和非公平锁区别是什么

公平锁: 就是很公平,在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己。
优点:线程不会存在饿死的现象。所有线程最后都会得到锁。
缺点:

  1. 吞吐量低。
  2. CPU唤醒线程的开销大。

非公平锁: 非公平锁比较粗鲁,上来就直接尝试占有锁,如果尝试失败,就再采用类似公平锁那种方式。
优点:

  1. 吞吐量高。
  2. 减少了唤醒线程的开销。
    缺点:存在线程饿死的现象。当后来的线程一直尝试占用锁,并且占用成功,那么队列中的某些线程就一直阻塞,一直持有不了锁,就会处于饿死状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值