JAVA 1.5 并发之 ReentrantLock
在文章里我不打算具体讲Lock的实现,对此有兴趣的请点击这篇博文
http://www.blogjava.net/BucketLi/archive/2010/09/30/333471.html
我是一个实用派,所以我想讲讲这货怎么用!讲得不全请多包涵
在Lock出现之前,一般实用的并发控制就是synchronized,用一个关键字包起整段代码,看起来比较简洁也简单粗暴是吧
但是很明显这种做法不够灵活,所以Lock就出现啦,但是本文只讲ReentrantLock
首先,New 一个 Lock
new ReentrantLock(); 默认是unfair
new ReentrantLock(bool fair); 一般都是用来设置为fair
公平锁就是大家有序的去上锁,效率比较低,而不公平锁基本靠抢,个人理解是对次序不重要的话就用不公平锁
接着,上锁
1) lock(); 这就是不顾一切的去抢Lock, 直到抢到
2) tryLock(); 尝试获取Lock, 如有则true, 没有则 false
3) tryLock(long timeout, TimeUnit unit); 在一段时间内尝试获取Lock, 其他同上
PS: 锁内是有计数的,如果在一个锁内继续上锁 则需连续解锁
用完解锁
Lock.unlock();
代码演示
public static void main(String[] args) throws InterruptedException { final ExecutorService exec = Executors.newFixedThreadPool(4);
final ReentrantLock lock = new ReentrantLock();
final Condition con = lock.newCondition();
final int time = 2; final Runnable add = new Runnable() { public void run() { System.out.println("Lock in " +Thread.currentThread().getId());
lock.lock(); try { con.await(time, TimeUnit.SECONDS);
//或者执行一些事情 } catch (InterruptedException e) {
e.printStackTrace();
} finally { System.out.println("Lock out" +Thread.currentThread().getId());
lock.unlock(); } } }; for(int index = 0; index < 4; index++)
new Thread(add).start();
}
输出:
Lock in 12
Lock in 14
Lock in 15
Lock in 13
Lock out13
Lock out14
Lock out12
Lock out15
这里要注意的是 lock out 统一出现在两秒之后,就是说在await的时候lock其实是被暂时释放了,这个在特定情况下有作用
await等待时间内对应的是condition.signal() 用来唤醒这个锁
如果那段代码是执行耗时的操作则是做一个走一个 与sleep()相同
JAVA 1.5 并发之 ReentrantLock的更多相关文章
- 高并发之ReentrantLock、CountDownLatch、CyclicBarrier
本系列研究总结高并发下的几种同步锁的使用以及之间的区别,分别是:ReentrantLock.CountDownLatch.CyclicBarrier.Phaser.ReadWriteLock.Stam ...
- java分析源码-ReentrantLock
一.前言 在分析了 AbstractQueuedSynchronier 源码后,接着分析ReentrantLock源码,其实在 AbstractQueuedSynchronizer 的分析中,已经提到 ...
- java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析
java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java ...
- 轻松学习java可重入锁(ReentrantLock)的实现原理
转载自https://blog.csdn.net/yanyan19880509/article/details/52345422,(做了一些补充) 前言 相信学过java的人都知道 synchroni ...
- java 可重入锁ReentrantLock的介绍
一个小例子帮助理解(我们常用的synchronized也是可重入锁) 话说从前有一个村子,在这个村子中有一口水井,家家户户都需要到这口井里打水喝.由于井水有限,大家只能依次打水.为了实现家家有水喝,户 ...
- 轻松学习java可重入锁(ReentrantLock)的实现原理(转 图解)
前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...
- Java读源码之ReentrantLock(2)
前言 本文是 ReentrantLock 源码的第二篇,第一篇主要介绍了公平锁非公平锁正常的加锁解锁流程,虽然表达能力有限不知道有没有讲清楚,本着不太监的原则,本文填补下第一篇中挖的坑. Java读源 ...
- Java:AQS 小记-2(ReentrantLock)
Java:AQS 小记-2(ReentrantLock) 整体结构 ReentrantLock 类图 AbstractOwnableSynchronizer 类 public abstract cla ...
- Java并发之ReentrantLock
一.ReentrantLock简介 ReentrantLock字面意义上理解为可重入锁.那么怎么理解可重入这个概念呢?或者说和我们经常用的synchronized又什么区别呢? ReentrantLo ...
随机推荐
- python(pytest)+allure+jenkins 实现接口自动化的思路
效果图镇楼: 上述各模块作用: python(pytest): 1:用于读测试用例(本次用例写在csv文件中) 2:环境配置相关 3:提取1中的测试数据,组成请求体 4:发送请求 5:获取结果 6:断 ...
- python基础-第六篇-6.4模块混战
我们之前接触多的编程方式就是函数式编程,而且喜欢就一个文件里写完所有的程序代码,这样做在前期感觉还不错,不过一旦你的程序变复杂,在易读性和排错方面就感觉好吃力,功能界限不明显,那今天我们就来讲讲怎么用 ...
- 从分布式锁来看redis和zookpeer!
从分布式锁来看redis和zookpeer! 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面.要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫.坦白说, ...
- ubunbu退出nano
无意中进入ubuntu GNU nano ctrl+x即可退出
- Linux mint
最近一直在配置vim, 今天终于配的差不多了,拿出来晒晒,^_^ . 附上一段Linux Mint 的简介(来自Wiki). Linux Mint是一种基于Ubuntu开发出的Linux操作系统.由L ...
- 第三章 python中的字符串
一.字符串的基本操作 所有标准的序列操作对字符串同样适用,如索引.分片.乘法.判断成员是否存在.求长度.最大值和最小值等.记住一点,字符串是不可变的. 二.字符串中重要的方法 1.find(subst ...
- a标签包着img事件 ie下 a标签的click事件失效
整个大的背景框有个点击事件, 如果标签结构是(详细的css样式略) a{background:green;} <a href=""> <img src=" ...
- Vue 5小时学习小教程
Vue Vue Vue 起步 指令 v-bind v-if v-for v-on v-model v-bind和v-on缩写 搭建Vue开发环境 vue项目结构 Vue开始 数据绑定, 绑定属性 循环 ...
- Java大坑之Integer对象比较相等
public class IntegerTest { /*** * 对于Integer var = ? 在 -128到127之间的复制,Integer对象是在IntegerCache.cache产生 ...
- 大话设计模式--代理模式 proxy
1. 代理模式: 为其他对象提供一种代理以控制这个对象的访问. 代理模式使用场合: a. 远程代理, 为一个对象在不同的地址空间提供局部代理,隐藏一个对象存在于不同地址空间的事实.如.net中WebS ...