在文章里我不打算具体讲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的更多相关文章

  1. 高并发之ReentrantLock、CountDownLatch、CyclicBarrier

    本系列研究总结高并发下的几种同步锁的使用以及之间的区别,分别是:ReentrantLock.CountDownLatch.CyclicBarrier.Phaser.ReadWriteLock.Stam ...

  2. java分析源码-ReentrantLock

    一.前言 在分析了 AbstractQueuedSynchronier 源码后,接着分析ReentrantLock源码,其实在 AbstractQueuedSynchronizer 的分析中,已经提到 ...

  3. java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析

    java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java ...

  4. 轻松学习java可重入锁(ReentrantLock)的实现原理

    转载自https://blog.csdn.net/yanyan19880509/article/details/52345422,(做了一些补充) 前言 相信学过java的人都知道 synchroni ...

  5. java 可重入锁ReentrantLock的介绍

    一个小例子帮助理解(我们常用的synchronized也是可重入锁) 话说从前有一个村子,在这个村子中有一口水井,家家户户都需要到这口井里打水喝.由于井水有限,大家只能依次打水.为了实现家家有水喝,户 ...

  6. 轻松学习java可重入锁(ReentrantLock)的实现原理(转 图解)

    前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...

  7. Java读源码之ReentrantLock(2)

    前言 本文是 ReentrantLock 源码的第二篇,第一篇主要介绍了公平锁非公平锁正常的加锁解锁流程,虽然表达能力有限不知道有没有讲清楚,本着不太监的原则,本文填补下第一篇中挖的坑. Java读源 ...

  8. Java:AQS 小记-2(ReentrantLock)

    Java:AQS 小记-2(ReentrantLock) 整体结构 ReentrantLock 类图 AbstractOwnableSynchronizer 类 public abstract cla ...

  9. Java并发之ReentrantLock

    一.ReentrantLock简介 ReentrantLock字面意义上理解为可重入锁.那么怎么理解可重入这个概念呢?或者说和我们经常用的synchronized又什么区别呢? ReentrantLo ...

随机推荐

  1. Js 抱错:::SyntaxError: identifier starts immediately after numeric literal

    SyntaxError: identifier starts immediately after numeric literal 今天写了个onclick()方法,有这样的一个变量4028b88161 ...

  2. Java之线程池(一)

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  3. template.helper 检测浏览器 时间转换

    template.helper('changeTime',function getLocalTime(nS) { var b=nS.substr(6,13); var c=parseInt(b) va ...

  4. dygraphs for R

    dygraphs一个功能非常强大的处理时间序列的画图包!画出的图在html中打开,鼠标点处,即可得到数据信息.详情见 http://rstudio.github.io/dygraphs/index.h ...

  5. 【SHARE】WEB前端学习资料

    参考资料:https://github.com/karlhorky/learn-to-program 学习网站:http://www.codecademy.com/learn https://www. ...

  6. ubunbu退出nano

    无意中进入ubuntu GNU nano ctrl+x即可退出

  7. 虚拟机ubuntu14.04系统设置静态ip

    ubuntu14.04 设置静态ip vim /etc/network/interfaces 原来只有 auto lo iface lo inet loopback 修改成如下: auto lo if ...

  8. if-else 与 switch-case语句

    if语句就是起一个判断作用,在c语言中有三种表达形式:1.if(表达式)语句:pl.   if(x==y)printf("%d",x);         //*  "== ...

  9. hbase shell-security(安全指令)

    hbase shell安全指令篇: grant list_security_capabilities revoke user_permission 正在编辑中

  10. Delphi 的进制转换

    1.10进制转16进制 intTohex(10,4);  //第一个参数为要转换的数据,第二个参数为要转换后的16进制位数:得到:000A; 2. 16进制转10进制 strToInt('$'+'64 ...