概述

CPU在调度线程的时候,会在等待队列里随机挑选一个线程。由于随机性,故不能保证线程先到先得(synchronized控制的锁就是这种非公平锁)。这样就会产生饥饿现象,即有些优先级较低的线程可能永远无法取得CPU的执行权,优先级较高的线程会不断抢占资源。于是,就有了公平锁。
公平锁可以保证线程按照时间顺序执行,避免饥饿现象的产生。但是公平锁的效率很低,因为要保证顺序执行,就得维护一个有序队列。

ReentrantLock创建公平、不公平锁

ReentrantLock便是公平锁,通过在构造方法中传入true就是公平锁,传入false就是非公平锁。当然,默认false

public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();}

使用公平锁实现效果:

public class LockFairTest implements Runnable {//创建公平锁private static ReentrantLock lock = new ReentrantLock(true);@Overridepublic void run() {while (true){lock.lock();try {System.out.println(Thread.currentThread().getName()+"获得锁");}finally {lock.unlock();}}}public static void main(String []args){LockFairTest lockFairTest = new LockFairTest();Thread t1 = new Thread(lockFairTest);Thread t2 = new Thread(lockFairTest);t1.start();t2.start();}
}

结果应该显而易见了,两个线程交替执行。

Java并发之公平锁相关推荐

  1. Java并发之ReentrantLock锁

    简介 一种可重入的互斥锁,经由Java5引入,支持一个线程对资源的重复加锁.它和synchronized语句和方法访问的隐式监视器锁,有相同的基本行为和语义,但是功能更强大.之所以存在synchron ...

  2. java并发锁有哪些,Java并发编程-公平锁与非公平锁

    写这个文章的时候让我想起了让子弹飞的一个台词 公平,公平,还是tmd公平! 什么是公平和非公平 首先,我们来看下什么是公平锁和非公平锁. 公平锁指的是按照线程请求的顺序,来分配锁: 非公平锁指的是不完 ...

  3. Java中的公平锁和非公平锁实现详解

    文章目录 前言 ReentrantLock的可重入性分析 synchronized的可重入性 ReentrantLock的可重入性 ReentrantLock锁的实现分析 公平锁和非公平锁 公平锁Fa ...

  4. java 饥饿现象,Java并发之“饥饿”和“公平锁”(Starvation and Fairness)

    饥饿发生的原因: 高优先级的线程占用了大部分的cpu时间,低优先级线程发生饥饿 线程被永久堵塞在一个等待进入同步块的状态 线程在等待一个本身(在其上调用wait())也处于永久等待完成的对象 java ...

  5. 公平锁和非公平锁介绍,为什么要“非公平”?

    什么是公平和非公平 公平锁指的是按照线程请求的顺序,来分配锁:而非公平锁指的是不完全按照请求的顺序,在一定情况下,可以允许插队.但需要注意这里的非公平并不是指完全的随机,不是说线程可以任意插队,而是仅 ...

  6. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  7. java公平索非公平锁_Java 并发编程中使用 ReentrantLock 替代 synchronized

    Java 5 引入的 Concurrent 并发库软件包中,提供了 ReentrantLock 可重入同步锁,用来替代 synchronized 关键字原语,并可提供更好的性能,以及更强大的功能.使用 ...

  8. java公平所与非公平所_一张图读懂Java非公平锁与公平锁

    前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820- 种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了,但是怀旧一下,欢迎加入六脉神剑Ja ...

  9. java投票锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...

最新文章

  1. 《编译与反编译技术实战 》一2.3 编译器的设计与实现概述
  2. LR运行9415商品拒绝问题
  3. Windows10 热点(WIFI)配置教程
  4. Node.js使用supervisor遭遇‘supervisor’不是内部或外部命令,如果解决?
  5. 当面试官要你介绍一下MQ时,该怎么回答?
  6. 麦克风阵列语音增强(一)
  7. 微信怎么收银行卡的消息服务器,微信零钱提现,这样操作,可以免去手续费
  8. 浏览器打开服务器图片不显示图片,网页图片不显示的原因 世界之窗浏览器网页显示不正常...
  9. python远程监控_Python实现远程端口监控实例
  10. Matlab实现指纹去噪增强
  11. 【WCN6856】WiFi 5G 接口启动失败问题解决
  12. 【每日一题】打卡 12
  13. 工程师解说raid6结构和原理
  14. 宇视科技android面试_浙江宇视科技有限公司面试经验
  15. 广义表,长度是( ),深度是( )
  16. 计算机故障代码ff,电脑DEBUG长代码显示FF故障检修
  17. 人脸检测的测试程序(视频和摄像头)
  18. 并网光伏逆变器的基本设计
  19. C Primer Plus 第六版---编程练习2
  20. 《医院管理系统》项目研发总结

热门文章

  1. postgresql----JSON类型和函数
  2. PostgreSQL 安装配置 (亲测可用)
  3. OCCI入门(VC2010下配置)
  4. 开启Windows 2003 最大内存支持
  5. 因特网的协议集称为TCP/IP协议集
  6. 学习LINUX第三天:最简单的LAMP组合(适合初学者)
  7. 构建Dubbo-2.0.7源码
  8. PHP clone() 函数克隆对象
  9. Confluence 6 注册外部小工具
  10. mysql设计规范和原则