Java之ReentrantLock公平锁和非公平锁
在Java的ReentrantLock构造函数中提供了两种锁:创建公平锁和非公平锁(默认)。代码如下:
public ReentrantLock() {
sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
此例可反应公平锁和非公平锁的差异:
package concurrency; import java.util.concurrent.locks.ReentrantLock; /**
* @author yuanxu
* Apr 11, 2017 9:59:24 PM
*/
public class ReentrantLockTest {
private static final ReentrantLock lock = new ReentrantLock();
private static final ReentrantLock fairlock = new ReentrantLock(true);
private int n; public static void main(String[] args) {
// TODO Auto-generated method stub
ReentrantLockTest rlt = new ReentrantLockTest();
for (int i=0; i<100; i++) {
Thread nonT = new Thread(new NonFairTestThread(rlt));
nonT.setName("nonFair[" + (i + 1) + "]");
nonT.start(); Thread fairT = new Thread(new FairTestThread(rlt));
fairT.setName("fair[" + (i + 1) + "]");
fairT.start();
}
} static class NonFairTestThread implements Runnable {
private ReentrantLockTest rlt; public NonFairTestThread(ReentrantLockTest rlt) {
this.rlt = rlt;
} public void run() {
lock.lock();
try {
rlt.setNum(rlt.getNum() + 1);
System.out.println(Thread.currentThread().getName()
+ " nonfairlock***************" + rlt.getNum());
} finally {
lock.unlock();
}
}
} static class FairTestThread implements Runnable {
private ReentrantLockTest rlt; public FairTestThread(ReentrantLockTest rlt) {
this.rlt = rlt;
} public void run() {
fairlock.lock();
try {
rlt.setNum(rlt.getNum() + 1);
System.out.println(Thread.currentThread().getName()
+ " fairlock=======" + rlt.getNum() + " "
+ fairlock.getHoldCount() + " queuelength="
+ fairlock.getQueueLength());
} finally {
fairlock.unlock();
}
}
} public void setNum(int n) {
this.n = n;
} public int getNum() {
return n;
} }
运行结果反映:
在公平的锁上,线程按照他们发出请求的顺序获取锁,但在非公平锁上,则允许‘插队’。
在公平的锁中,如果有另一个线程持有锁或者有其他线程在等待队列中等待这个所,那么新发出的请求的线程将被放入到队列中。而非公平锁上,只有当锁被某个线程持有时,新发出请求的线程才会被放入队列中。
非公平锁性能高于公平锁性能的原因: 在恢复一个被挂起的线程与该线程真正运行之间存在着严重的延迟。
参考:
http://blog.csdn.net/zmx729618/article/details/51593666
http://blog.csdn.net/qq_22929803/article/details/51458340
Java之ReentrantLock公平锁和非公平锁的更多相关文章
- 死磕 java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁
问题 (1)重入锁是什么? (2)ReentrantLock如何实现重入锁? (3)ReentrantLock为什么默认是非公平模式? (4)ReentrantLock除了可重入还有哪些特性? 简介 ...
- java多线程20 : ReentrantLock中的方法 ,公平锁和非公平锁
公平锁与非公平锁 ReentrantLock有一个很大的特点,就是可以指定锁是公平锁还是非公平锁,公平锁表示线程获取锁的顺序是按照线程排队的顺序来分配的,而非公平锁就是一种获取锁的抢占机制,是随机获得 ...
- java并发库 Lock 公平锁和非公平锁
jdk1.5并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,关于两者区别,java并发编程实践里面有解释 公平锁: Threads acquir ...
- Java中的公平锁和非公平锁实现详解
前言 Java语言中有许多原生线程安全的数据结构,比如ArrayBlockingQueue.CopyOnWriteArrayList.LinkedBlockingQueue,它们线程安全的实现方式并非 ...
- Java 公平锁与非公平锁学习研究
最近学习研究了一下Java中关于公平锁与非公平锁的底层实现原理,总结了一下. 首先呢,通过其字面意思,公平与非公平的评判标准就是付出与收获成正比(和社会中的含义差不多一个意思).放到程序中,尤其是 在 ...
- Java并发指南8:AQS中的公平锁与非公平锁,Condtion
一行一行源码分析清楚 AbstractQueuedSynchronizer (二) 转自https://www.javadoop.com/post/AbstractQueuedSynchronizer ...
- Java中的锁-悲观锁、乐观锁,公平锁、非公平锁,互斥锁、读写锁
总览图 如果文中内容有错误,欢迎指出,谢谢. 悲观锁.乐观锁 悲观锁.乐观锁使用场景是针对数据库操作来说的,是一种锁机制. 悲观锁(Pessimistic Lock):顾名思义,就是很悲观,每次去拿数 ...
- Java并发编程锁之独占公平锁与非公平锁比较
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...
- 浅谈Java中的公平锁和非公平锁,可重入锁,自旋锁
公平锁和非公平锁 这里主要体现在ReentrantLock这个类里面了 公平锁.非公平锁的创建方式: //创建一个非公平锁,默认是非公平锁 Lock lock = new ReentrantLock( ...
随机推荐
- vue2 自定义时间过滤器
// template {{a | data}} //script data:{ a: Date.now() } filters: { data:function (input) {
- 通用性好的win2003序列号: (推荐先用这个里面的)
通用性好的win2003序列号: (推荐先用这个里面的)FJ8DH-TQPYG-9KFHQ-88CB2-Y7V3Y GRD4P-FTQQF-JCDM8-4P6JK-PFG7MJD7JX-KCDTH-7 ...
- Python版求数组的最大连续区间
[本文出自天外归云的博客园] 题目:有一个数组,求他的最大(最长)连续区间(数字是连续的区间). 我的解法,如下: class Finder(object): ''' 判断两个相邻的数字是否连续,若连 ...
- LR中,URL -based script与HTML -based script区别
在Web(HTTP/HTML)录制中,有2种重要的录制模式.用户该选择那种录制模式呢?HTML-mode录制是缺省也是推荐的录制模式.它录制当前网页中的HTML动作.在录制会话过程中不会录制所有的资源 ...
- 基于jQuery鼠标点击弹出登陆框效果
基于jQuery鼠标点击弹出登陆框效果.这是一款扁平样式风格的jQuery弹出层登陆框特效.效果图如下: 在线预览 源码下载 实现的代码. html代码: <input type=" ...
- java好用的邮件发送
1.action代码 // 发送邮件 String strEMAIL = Tools.readTxtFile(Const.EMAIL); //读取邮件配置 String strEM[] = strEM ...
- [转]Oracle 树操作(select…start with…connect by…prior)
原文地址:https://www.cnblogs.com/colder/p/4838574.html oracle树查询的最重要的就是select…start with…connect by…prio ...
- [note]What I’ve learnt from working on startups
What I've learnt from working on startups 从失败里学到了什么,六次创业失败. 企业家不是与生俱来的,也是靠学来的. 想的太多,做的太少.
- mysql archive存储引擎导入数据报duplicate key
DROP TABLE IF EXISTS `test`;CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `ve ...
- 【jquery】fancybox 是一款优秀的 jquery 弹出层展示插件
今天给大家分享一款优秀的 jquery 弹出层展示插件 fancybox.它除了能够展示图片之外,还可以展示 flash.iframe 内容.html 文本以及 ajax 调用,我们可以通过 css ...