修改锁的公平性

  ReentrantLock和ReentrantReadWriteLock类的构造器都含有一个布尔参数fair,它允许你控制这两个类的行为。默认fair值为false,它称为非公平模式(Non-Fair Mode)。在非公平模式下,当有很多线程在等待锁(ReentrantLock和ReentrantReadWriteLock)时,锁将选择它们当中的一个来访问临界区,这个选择是没有任何约束的。如果fair值是true,则称为公平模式(Fair Mode)。在公平模式下,当有很多线程在等待锁(ReentrantLock和ReentrantReadWriteLock)时,锁将选择它们中的一个来访问临界区,而且选择的是等待时间最长的。这两种模式只适用于lock()和unlock()方法。而Lock接口的tryLock()方法没有将线程置于休眠,fair属性并不影响这个方法。

  下面我们将修改“使用锁实现同步”当中的范例来使用这个属性,并观察公平模式和非公平模式之间的区别。

1. 创建一个打印队列类PrintQueue。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class PrintQueue {//声明一个锁对象,并且用ReentrantLock类初始化private final Lock queueLock = new ReentrantLock(true);//实现打印方法public void printJob(Object doucument){queueLock.lock();Long duration = (long) (Math.random()*10000);System.out.println(Thread.currentThread().getName()+": PrintQueue: Printing a Job during "+(duration/1000)+" seconds");try {Thread.sleep(duration);} catch (InterruptedException e) {// TODO Auto-generated catch block
            e.printStackTrace();} finally {queueLock.unlock();}queueLock.lock();duration = (long) (Math.random()*10000);System.out.println(Thread.currentThread().getName()+": PrintQueue: Printing a Job during "+(duration/1000)+" seconds");try {Thread.sleep(duration);} catch (InterruptedException e) {// TODO Auto-generated catch block
            e.printStackTrace();} finally {queueLock.unlock();}}}

2. 创建打印工作类Job并且实现Runnable接口。

public class Job implements Runnable {private PrintQueue printQueue;public Job(PrintQueue printQueue){this.printQueue = printQueue;}@Overridepublic void run() {System.out.printf("%s: Going to print a document\n", Thread.currentThread().getName());printQueue.printJob(new Object());System.out.printf("%s: The Document has been printed\n", Thread.currentThread().getName());}}

3. 创建范例的主类Main

public class Main {public static void main(String[] args) {//创建一个共享的打印队列对象PrintQueue printQueue = new PrintQueue();//创建10个打印工作Job对象Thread threads[] = new Thread[10];for(int i=0;i<10;i++){threads[i] = new Thread(new Job(printQueue), "Thread"+i);}//启动10个线程try {for(int i=0;i<10;i++){threads[i].start();Thread.sleep(100);}} catch (InterruptedException e) {// TODO Auto-generated catch block
            e.printStackTrace();}}
}

4. 程序运行结果如下

Thread0: Going to print a document
Thread0: PrintQueue: Printing a Job during 4 seconds
Thread3: Going to print a document
Thread2: Going to print a document
Thread1: Going to print a document
Thread4: Going to print a document
Thread5: Going to print a document
Thread6: Going to print a document
Thread7: Going to print a document
Thread8: Going to print a document
Thread9: Going to print a document
Thread3: PrintQueue: Printing a Job during 9 seconds
Thread2: PrintQueue: Printing a Job during 3 seconds
Thread1: PrintQueue: Printing a Job during 7 seconds
Thread4: PrintQueue: Printing a Job during 7 seconds
Thread5: PrintQueue: Printing a Job during 5 seconds
Thread6: PrintQueue: Printing a Job during 6 seconds
Thread7: PrintQueue: Printing a Job during 0 seconds
Thread8: PrintQueue: Printing a Job during 7 seconds
Thread9: PrintQueue: Printing a Job during 5 seconds
Thread0: PrintQueue: Printing a Job during 4 seconds
Thread0: The Document has been printed
Thread3: PrintQueue: Printing a Job during 5 seconds
Thread3: The Document has been printed
Thread2: PrintQueue: Printing a Job during 1 seconds
Thread2: The Document has been printed
Thread1: PrintQueue: Printing a Job during 9 seconds
Thread1: The Document has been printed
Thread4: PrintQueue: Printing a Job during 4 seconds
Thread4: The Document has been printed
Thread5: PrintQueue: Printing a Job during 2 seconds
Thread5: The Document has been printed
Thread6: PrintQueue: Printing a Job during 5 seconds
Thread6: The Document has been printed
Thread7: PrintQueue: Printing a Job during 9 seconds
Thread7: The Document has been printed
Thread8: PrintQueue: Printing a Job during 4 seconds
Thread8: The Document has been printed
Thread9: PrintQueue: Printing a Job during 6 seconds
Thread9: The Document has been printed

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

也说翟鸿燊忽悠的一面

最近看了一篇批评翟鸿燊文章“且看又一位“国学大师”翟鸿燊的拙劣表演”&#xff0c;此文写的相当有水平&#xff0c;切入问题比较深刻一看就是有备而来、品味之余正好借着这个题目来表达一下我关于翟鸿燊讲座的观点。整理作者思路主要表述了以下几点意见&#xff1a;1、质疑翟…

JDBC基础和使用

内存泄漏意思就是内存越来越少了&#xff0c;因为垃圾太多&#xff1b; 线程泄露就是线程池中线程越来越少&#xff0c;执行过程中异常&#xff0c;没有返回给线程池&#xff0c;线程池中线程越来越少&#xff1b; 一、概念 二、快速入门 三、JDBC各个类详解 1、driverManager …

车间生产能耗管控方案_SAREN三仁净化工程:锂电池生产车间的设计规范及方案...

对于锂电池厂厂房装修而言&#xff0c;必须做好车间设计&#xff0c;因为锂电池的生产需要一个洁净的车间环境。锂电池厂厂房装修的车间设计要领主要体现在5方面&#xff0c;即&#xff1a;人员与物料布局、确定清洁度等级、确定空间压力差、确定空间空气平衡、确定机械系统布局…

将uglifyjs添加到鼠标右键菜单

之前几天根据YUICompressor和TBCompressor整合到鼠标右键菜单自己将uglifyjs也添加到了右键菜单&#xff0c;下面简单记录下过程。效果如下 uglifyjs添加到鼠标右键菜单配置windows nodepath环境 鼠标右键我的电脑&#xff0c;选择属性→高级属性管理→高级选项卡→环境变量&am…

使用Wine 1.6.2 在OS X El Capitan下运行Galgame

经过一些尝试&#xff0c;我成功在OS X El Capitan下使用wine运行了一些windows游戏&#xff0c;下面来逐一介绍运行这些游戏的经验。 魔法使之夜 引擎&#xff1a;Kirikiki 2 语言&#xff1a;日本语 打开游戏iso后拷贝游戏所在目录到本地文件夹&#xff08;我用的是$HOME/mah…

如何获取组SPGroup的描述Description信息

通过SPGroup的Description属性是不能获取到组的描述信息的&#xff0c;貌似是一个bug--- Reflect了一下系统的代码&#xff0c;发现系统是这样写的&#xff1a; protected void Page_Load(object sender, EventArgs e) { SPSecurity.RunWithElevatedPrivil…

1标志图片_这四种情况将不再扣分罚款!11月起,全国高速统一限速标志

如果你经常跑高速&#xff0c;那么你可能经常会有这样的经历&#xff1a;本来开车开得好好的&#xff0c;忽然遇到限速标志&#xff0c;赶紧进行紧急刹车。又或者限速标志在不醒目的地方&#xff0c;完全没有发现&#xff0c;等到下了高速才知道自己因为超速被扣分了~这些问题不…

CSP-S集训刷题记录

$ CSP.S $ 集训刷题记录&#xff1a; $ By~wcwcwch $ 一、字符串专题&#xff1a; 1. 【模板】$ manacher $ 算法 模型&#xff1a; 求出字符串 $ S $ 中所有回文串的位置及长度。 $ solution $ &#xff1a; 个人理解&#xff1a;解决这类问题&#xff0c;回文串的对称性质最重…

NPOI 菜鸟实践行之根据指定的模板生成Excel 2003格式的文件 (一)

感谢群里的各位朋友的指导和教学&#xff0c;感谢Tony Qu的热心指导&#xff0c;感谢阿修罗兄提供的Excelhelper类 谈谈个人对Excel的理解&#xff0c;结合NPOI&#xff0c;个人水平一般般&#xff0c;菜鸟一只 Excel 打开后&#xff0c;分为sheet-文件簿&#xff0c;Rows-行&a…

Java设计模式12:装饰器模式

装饰器模式 装饰器模式又称为包装&#xff08;Wrapper&#xff09;模式。装饰器模式以多客户端透明的方式扩展对象的功能&#xff0c;是继承关系的一个替代方案。 装饰器模式的结构 通常给对象添加功能&#xff0c;要么直接修改对象添加相应的功能&#xff0c;要么派生子类来扩…

差分管电路图_最简单的单差分OCL功放电路图(四款单差分OCL功放电路设计原理图详解)...

最简单的单差分OCL功放电路图(一)本电路采用了单管输入、推挽放大和阻容耦舍的输入级&#xff0c;解决了差分管配对的难题&#xff0c;而实际电路又达到了较高的技术水平&#xff0c;是一款十分优秀的功放电路。电路原理如图2-8所示。它由三部分组成&#xff1a;输入级、中间缓…

Google Maps API 代码

阅读全文并下载&#xff1a;http://www.cckan.net/forum.php?modviewthread&tid54 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http:/…

JDBC使用案例

一、结果集中获取数据并对实体set值&#xff0c;封装成对象返回&#xff1b; 2、封装JDBC工具类 只要执行一次的&#xff0c;如读取配置文件&#xff0c;则写静态代码块&#xff1b; 异常抛出要写明方法才可以throw&#xff0c;静态代码块异常只能捕捉try catch; 类加载器两个作…

Android入门:Log介绍

一、Log类介绍 在Logcat视图中查看Android日志信息&#xff1b; (1)Log.v()&#xff1a;任意信息&#xff1b; (2)Log.e()&#xff1a;error信息&#xff1b; (3)Log.w()&#xff1a;warning信息&#xff1b; (4)Log.i()&#xff1a;提示信息&#xff1b; (5)Log.d()&#xff1…

docker启动nginx后挂了_Docker容器部署 Nginx服务

1.查找 Docker Hub 上的 nginx 镜像[rootlocalhost ~]# docker search nginx2.拉取官方的Nginx镜像[rootlocalhost ~]# docker pull nginx3.在本地镜像列表里查到 REPOSITORY 为 nginx 的镜像[rootlocalhost ~]# docker images nginxREPOSITORY TAG IMAGE ID CREATED SIZEdocke…

JAVA中的日志框架-log4j的使用

JAVA日志-使用log4j 1. log4j.jar下载 windows下载地址&#xff1a; http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.15/apache-log4j-1.2.15.zip Linux平台下的下载地址&#xff1a; http://download.chinaunix.net/download.php?id12696&ResourceID6256 把l…

childNodes详解

定义和用法 childNodes 属性返回节点的子节点集合&#xff0c;以 NodeList 对象。 提示&#xff1a;您可以使用 length 属性来确定子节点的数量&#xff0c;然后您就能够遍历所有的子节点并提取您需要的信息。 浏览器支持 所有主流浏览器都支持 childNodes 属性。 语法 element…

PreparedStatement预编译的sql执行对象

一、预编译&#xff0c;防sql注入 其中&#xff0c;设置参数值占位符索引从1开始&#xff1b;在由sql 连接对象创建 sql执行对象时候传入参数sql语句&#xff0c;在执行对象在执行方法时候就不用再传入sql语句&#xff1b; 数据库索引一般是从1开始&#xff0c;java对象一般是从…

祝贺父亲节快乐的python代码_祝福父亲节快乐的句子50句

祝福父亲节快乐的句子50句祝福父亲节快乐的句子50句导语&#xff1a;他是一棵苍天大树&#xff0c;为我们遮风挡雨&#xff0c;呵护我们健康成长。下面励志故事网小编为大家整理了祝福父亲节快乐的句子&#xff0c;希望大家喜欢。1. 老爸老爸您最棒&#xff0c;身强体壮有力量。…

Linux下Vi/Vim的使用方法

本文介绍了vi (vim)的基本使用方法&#xff0c;但对于普通用户来说基本上够了&#xff01;i/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim 是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法…