天天看点

公平锁与非公平锁

@[toc]

锁的分类

公平锁与非公平锁

什么是公平 与 非公平

  • 公平是按照线程的请求顺序,来分配锁 非公平是指不完全按照请求的顺序,在一定情况下,可以插队的

注意:非公平也同样不提倡 插队行为,这里的非公平是指在合适的时机插队,而不是盲目的插队

为什么要有非公平锁

  • ava设计者 这样设计的目的,是为了提高效率

    避免唤醒带来的空档期

公平的情况 ReentrantLock

如果创建 ReentrantLock对象时,参数填写为 true ,那么这就是个公平锁 依次执行
公平锁与非公平锁
公平锁与非公平锁
  • 我们可以看下ReentrantLock 源码 官方的解释是当为true的时候 就是公平策略

    是个三母运算符 为 true则新建个 FairSync()方法

公平锁与非公平锁
  • ync object for fair locks 公平锁的同步对象 方法继承了 extends Sync
  • 并且 在 if判断中,他会先获取下排队的线程

不公平的情况 ReentrantLock

线程1 获取锁,释放锁,线程2在排队等待获取锁,但是线程5 突然插队拿到锁,这就是非公平锁,线程2还没来得及获取锁,

ReentrantLock 默认的就是非公平策略

通过源码可以发现

公平锁与非公平锁

三目 默认走的是false ,非公平锁策略

公平锁与非公平锁
公平锁与非公平锁
  • 公平锁不同的是 ,他不会获取正在排队的线程

对比公平锁,非公平锁的优点和缺点

公平锁与非公平锁