在文章里我不打算具体讲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. java堆分析神器MAT

    Memory Analyzer(MAT) 基于Eclipse的软件 http://www.eclipse.org/mat/

  2. Oracle数据库获取uuid函数

    Oracle新建系统表时,要求主键为32位uuid,推測Oracle肯定会提供相关的函数. 翻阅相关文档,果然发现Oracle提供的函数 sys_guid() 用于获取32位uuid,简单使用为 se ...

  3. spring+hibernate+springmvc整合框架搭建

    搭建maven web项目这里不再讲述,详情请查看http://www.cnblogs.com/wql025/p/5215570.html 现在讲述项目的搭建过程. 1.通过maven导入项目所用的j ...

  4. strstr使用

    extern char strstr(char str1, const char *str2); 语法: strstr(str1,str2) str1: 被查找目标 string expression ...

  5. lazyload.js参数说明

    lazyload.js是jQuery的一个插件,可以用来实现图片异步加载. lazyload插件如何添加参数: $("img").lazyload({ //参数添加到此位置,建议一 ...

  6. Spring笔记:IOC基础

    Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...

  7. 高性能javascript学习总结(1)--加载与运行

    一.脚本的位置         我们知道,一个<script>标签可以放在 HTML 文档的<head>或<body>标签中,但是浏览器是怎么加载和执行这些java ...

  8. HDU - 3081 Marriage Match II 【二分匹配】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意 有n对男女 女生去选男朋友 如果女生从来没和那个男生吵架 那么那个男生就可以当她男朋友 女 ...

  9. jQuery水平滑动菜单

    在线演示 本地下载

  10. github与eclipse结合使用

    github是现在流行的代码托管平台,今天以eclipse为例讲解github的使用,新建项目,提交eclipse项目到github,新建分支,合并分支 1.github上新建项目 记下githug项 ...