package lock.reentrantlock;import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** 描述:     演示公平和不公平两种情况*/
public class FairLock {public static void main(String[] args) {PrintQueue printQueue = new PrintQueue();Thread thread[] = new Thread[10];for (int i = 0; i < 10; i++) {thread[i] = new Thread(new Job(printQueue));}for (int i = 0; i < 10; i++) {thread[i].start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}class Job implements Runnable {PrintQueue printQueue;public Job(PrintQueue printQueue) {this.printQueue = printQueue;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "开始打印");printQueue.printJob(new Object());System.out.println(Thread.currentThread().getName() + "打印完毕");}
}class PrintQueue {private Lock queueLock = new ReentrantLock(true);public void printJob(Object document) {queueLock.lock();try {int duration = new Random().nextInt(10) + 1;System.out.println(Thread.currentThread().getName() + "正在打印,需要" + duration);Thread.sleep(duration * 1000);} catch (InterruptedException e) {e.printStackTrace();} finally {queueLock.unlock();}queueLock.lock();try {int duration = new Random().nextInt(10) + 1;System.out.println(Thread.currentThread().getName() + "正在打印,需要" + duration+"秒");Thread.sleep(duration * 1000);} catch (InterruptedException e) {e.printStackTrace();} finally {queueLock.unlock();}}
}

针对tryLock()方法,它是很猛的,它不遵守设定的公平的规则
例如,当有线程执行tryLock()的时候,一旦有线程释放了锁,那么这个正在tryLock()的线程就能获取到锁,即使在它之前已经有其他线程正在等待队列里等待了

代码演示:先来后到的特例、优劣、源码分析相关推荐

  1. android 事件分发 代码解析,Android事件分发之源码分析

    原文首发于微信公众号:躬行之,欢迎关注交流! 上篇文章中叙述了 Android 事件分发的大致流程,下面从 Activity.ViewGroup.View 三个方面介绍事件的相关方法,小节如下: Ac ...

  2. python用一行代码编写一个回声程序_Python源码分析2 - 一个简单的Python程序的执行...

    本文主要通过跟踪一个非常简单的Python程序的执行,简单讨论Python实现的基本框架和结构. 要执行Python程序如下,功能非常简单:从1加到10再打印出来 # test program sum ...

  3. 转 MySQL源码分析

    看到一个不错的介绍,原址如下: http://software.intel.com/zh-cn/blogs/2010/08/20/mysql0/ MySQL源码分析(0):编译安装及调试 作者: Yu ...

  4. Spring IOC 容器源码分析 - 获取单例 bean

    1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...

  5. Storm源码分析之四: Trident源码分析

    Storm源码分析之四: Trident源码分析 @(STORM)[storm] Storm源码分析之四 Trident源码分析 一概述 0小结 1简介 2关键类 1Spout的创建 2spout的消 ...

  6. 【JDK】JDK源码分析-CountDownLatch

    概述 CountDownLatch 是并发包中的一个工具类,它的典型应用场景为:一个线程等待几个线程执行,待这几个线程结束后,该线程再继续执行. 简单起见,可以把它理解为一个倒数的计数器:初始值为线程 ...

  7. csi-provisioner源码分析

    本文个人博客地址:https://www.huweihuang.com/kubernetes-notes/develop/csi-provisioner.html 本文主要分析csi-provisio ...

  8. Redux源码分析--Enhancer

    Redux源码分析: Redux源码分析--Middleware(1) Redux源码分析--Middleware(2) Redux源码分析--Enhancer Redux源码分析--createSt ...

  9. 【SemiDrive源码分析】系列文章链接汇总(全)

    注意:兄弟们,因为要换工作了,本专栏暂时先不更新了,如果后续工作也涉及芯驰平台的话,那我还会继续更新下去. 有好工作机会的兄弟,也可以私信介绍给我,可以聊聊 谢谢!!! 注意:兄弟们,因为一些其他原因 ...

  10. zebra源码分析-导读

    zebra源码分析-导读 客户端架构 JDBC 核心部分介绍 代码流程 数据源 Statement 参考 zebra源码分析-导读 zebra是一个基于JDBC API协议上开发出的高可用.高性能的数 ...

最新文章

  1. ROS中launch文件使用笔记
  2. win7 cmd 操作mysql数据库
  3. thinkphp-权限控制
  4. 【最全最详细】publiccms实现将公共部分提取成单独模块引入
  5. 面型对象 (包package)
  6. 不可小视的贝叶斯(三)
  7. 拜托!面试请不要再问我Spring Cloud底层原理
  8. pycharm打开cmd乱码问题
  9. win10禁用全角_win10输入法全角半角怎么切换 快捷键使用教程
  10. 叶俊:没有人会把钱存在有漏洞的账户
  11. 内存泄漏的原因及解决方法
  12. 吊打安卓?鸿蒙OS 2,android热更新流程
  13. 利用转写软件进行高效记录
  14. 2017年搜狗校招Java研发笔试编程题
  15. 软件测试面试常见的题目(内含答案)
  16. 各类通信协议归纳整理(偏硬件)
  17. Alibaba 官方微服务扛把子「SpringCloudAlibaba 全彩学习手册.PDF」,开源学习ing,
  18. 云计算医疗行业解决方案的前世今生
  19. Deep Leaning 常用要点总结
  20. 降低论文查重的方法,亲测有效

热门文章

  1. 【Python】单元测试框架unitest及其高级应用
  2. delphi fastreport 动态加载图片
  3. js tool 方法之删除数组指定项
  4. C#语句——循环语句(for循环与for循环嵌套)
  5. Zigbee 获取设备地址信息
  6. Linux下部署MyEclipse开发环境
  7. 更改整个目录文件的所有权限
  8. 微信中禁止网页下拉出现网页由XXX提供 【亲测有效】
  9. 热门的“挑战视频”,凭什么火起来的?
  10. SAPGUI系统登录页面配置的SAProuter有什么用 1