代码演示:先来后到的特例、优劣、源码分析
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()的线程就能获取到锁,即使在它之前已经有其他线程正在等待队列里等待了
代码演示:先来后到的特例、优劣、源码分析相关推荐
- android 事件分发 代码解析,Android事件分发之源码分析
原文首发于微信公众号:躬行之,欢迎关注交流! 上篇文章中叙述了 Android 事件分发的大致流程,下面从 Activity.ViewGroup.View 三个方面介绍事件的相关方法,小节如下: Ac ...
- python用一行代码编写一个回声程序_Python源码分析2 - 一个简单的Python程序的执行...
本文主要通过跟踪一个非常简单的Python程序的执行,简单讨论Python实现的基本框架和结构. 要执行Python程序如下,功能非常简单:从1加到10再打印出来 # test program sum ...
- 转 MySQL源码分析
看到一个不错的介绍,原址如下: http://software.intel.com/zh-cn/blogs/2010/08/20/mysql0/ MySQL源码分析(0):编译安装及调试 作者: Yu ...
- Spring IOC 容器源码分析 - 获取单例 bean
1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...
- Storm源码分析之四: Trident源码分析
Storm源码分析之四: Trident源码分析 @(STORM)[storm] Storm源码分析之四 Trident源码分析 一概述 0小结 1简介 2关键类 1Spout的创建 2spout的消 ...
- 【JDK】JDK源码分析-CountDownLatch
概述 CountDownLatch 是并发包中的一个工具类,它的典型应用场景为:一个线程等待几个线程执行,待这几个线程结束后,该线程再继续执行. 简单起见,可以把它理解为一个倒数的计数器:初始值为线程 ...
- csi-provisioner源码分析
本文个人博客地址:https://www.huweihuang.com/kubernetes-notes/develop/csi-provisioner.html 本文主要分析csi-provisio ...
- Redux源码分析--Enhancer
Redux源码分析: Redux源码分析--Middleware(1) Redux源码分析--Middleware(2) Redux源码分析--Enhancer Redux源码分析--createSt ...
- 【SemiDrive源码分析】系列文章链接汇总(全)
注意:兄弟们,因为要换工作了,本专栏暂时先不更新了,如果后续工作也涉及芯驰平台的话,那我还会继续更新下去. 有好工作机会的兄弟,也可以私信介绍给我,可以聊聊 谢谢!!! 注意:兄弟们,因为一些其他原因 ...
- zebra源码分析-导读
zebra源码分析-导读 客户端架构 JDBC 核心部分介绍 代码流程 数据源 Statement 参考 zebra源码分析-导读 zebra是一个基于JDBC API协议上开发出的高可用.高性能的数 ...
最新文章
- ROS中launch文件使用笔记
- win7 cmd 操作mysql数据库
- thinkphp-权限控制
- 【最全最详细】publiccms实现将公共部分提取成单独模块引入
- 面型对象 (包package)
- 不可小视的贝叶斯(三)
- 拜托!面试请不要再问我Spring Cloud底层原理
- pycharm打开cmd乱码问题
- win10禁用全角_win10输入法全角半角怎么切换 快捷键使用教程
- 叶俊:没有人会把钱存在有漏洞的账户
- 内存泄漏的原因及解决方法
- 吊打安卓?鸿蒙OS 2,android热更新流程
- 利用转写软件进行高效记录
- 2017年搜狗校招Java研发笔试编程题
- 软件测试面试常见的题目(内含答案)
- 各类通信协议归纳整理(偏硬件)
- Alibaba 官方微服务扛把子「SpringCloudAlibaba 全彩学习手册.PDF」,开源学习ing,
- 云计算医疗行业解决方案的前世今生
- Deep Leaning 常用要点总结
- 降低论文查重的方法,亲测有效