lock():若lock被thread A取得,thread B会进入block状态,直到取得lock;
tryLock():若当下不能取得lock,thread就会放弃,可以设置一个超时时间参数,等待多久获取不到锁就放弃;
lockInterruptibly():跟lock()情況一下,但是thread B可以通过interrupt中断,放弃继续等待锁

lock 与 lockInterruptibly比较区别在于:lock 优先考虑获取锁,待获取锁成功后,才响应中断,而lockInterruptibly 优先考虑响应中断

ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获取锁,而会抛出一个InterruptedException

ReentrantLock.lock方法不允许Thread.interrupt中断,即使检测到Thread.isInterrupted,一样会继续尝试获取锁,失败则继续休眠。只是在最后获取锁成功后再把当前线程置为interrupted状态,然后再中断线程

public class LockDemo {

    private ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) throws InterruptedException {
final LockDemo lockDemo = new LockDemo(); Thread threada = new Thread("Thread A") {
@Override
public void run() {
lockDemo.doSomeThing3(Thread.currentThread());
}
};
threada.start(); Thread threadb = new Thread("Thread B") {
@Override
public void run() {
lockDemo.doSomeThing3(Thread.currentThread());
}
};
threadb.start(); //threadb.interrupt();
} public void doSomeThing1(Thread thread) {
lock.lock();
try {
System.out.println(thread.getName() + "得到了锁.");
Thread.sleep();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println(thread.getName() + "释放了锁.");
lock.unlock();
}
} public void doSomeThing2(Thread thread) {
if (lock.tryLock()) {
try {
System.out.println(thread.getName() + "得到了锁.");
Thread.sleep();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println(thread.getName() + "释放了锁.");
lock.unlock();
}
} else {
System.out.println(thread.getName() + "获取锁失败.");
}
} public void doSomeThing3(Thread thread) {
try {
lock.lockInterruptibly();
System.out.println(thread.getName() + " 得到了锁.");
Thread.sleep();
} catch (InterruptedException e1) {
e1.printStackTrace();
System.out.println(thread.getName() + " interrupted.");
} finally {
System.out.println(thread.getName() + " 释放了锁.");
lock.unlock();
}
} }

 

lock、tryLock和lockInterruptibly的差別的更多相关文章

  1. Java中Lock,tryLock,lockInterruptibly的区别

    转载自:https://www.zhihu.com/question/36771163/answer/68974735 ReentrantLock 锁有好几种,除了常用的lock ,tryLock , ...

  2. JUC - ReentrantLock 的基本用法 以及 lock()、tryLock()、lockInterruptibly()的区别

    ReentrantLock 与 synchronized对比 最近有在阅读Java并发编程实战这本书,又看到了ReentrantLock和synchronized的对比,发现自己以前对于Renntra ...

  3. ReentrantLock可重入锁lock,tryLock的区别

    void lock(); Acquires the lock. Acquires the lock if it is not held by another thread and returns im ...

  4. [FAQ]String(字串相連)與StringBuilder的差別、原理與優缺點?

    原文位於 http://www.dotblogs.com.tw/mis2000lab/archive/2013/09/09/msdn_string_stringbuilder.aspx [FAQ]St ...

  5. xhtml和html的差別

    xhtml和html主要區別: 元素必須正確嵌套: 元素必須正確閉合: 必須要有根元素: 元素必須使用小寫. xhtml語法: 屬性名必須小寫: 屬性值必須帶引號: 使用id代替name: lang屬 ...

  6. nvarchar, varchar, nchar, char的差別

    1. var,意思是可變動的,因為欄位長度可變動,所以會額外花費2Byte去儲存地址2. n,支援UNICODE UCS-2字元,因為萬國編碼(支援中文字),所以1字儲存2Byte nvarchar: ...

  7. 阿里面试实战题2----ReentrantLock里面lock和tryLock的区别

    ReentrantLock ReentrantLock(轻量级锁)也可以叫对象锁,可重入锁,互斥锁.synchronized重量级锁,JDK前期的版本lock比synchronized更快,在JDK1 ...

  8. Thread--lock,lockInterruptibly,tryLock,tryLock(long timeout, TimeUnit unit)

    参考:http://www.dewen.net.cn/q/9077 http://coolxing.iteye.com/blog/1236909 lock,tryLock,lockInterrupti ...

  9. Java多线程学习之Lock与ReentranLock详解

    synchronized 是内置锁,而Lock 接口定义的是显示锁,Lock 提供了一种可重入的.可轮询的.定时的以及可中断的锁获取操作. ReenTranLock实现了Lock接口,并提供了与syn ...

随机推荐

  1. Java学习——BigInteger类和BigDecimal类

    Java学习——BigInteger类和BigDecimal类 摘要:本文主要学习了用于大数字运算的BigInteger类和BigDecimal类. 部分内容来自以下博客: https://www.c ...

  2. PHP工作岗位要求

    初级PHP 企业对初级PHP的要求是,在日常工作中,保证编码质量,对一般问题具有解决能力. 1.团队合作:经常是Git或者SVN.主要是为了能够融入敏捷开发团队2.前端:HTML.CSS.JS要精通. ...

  3. python如何通过windows命令行运行一个python程序文件?

    python如何通过windows命令行运行一个python程序文件? cmd 进入到py文件对应目录下或者直接在上面的文件地址栏输入cmd,敲入回车 定位到对应的目录下 输入python xxx.p ...

  4. vue中利用Promise封装jsonp并调取数据

    Promise就是一个给一步操作提供的容器,在这个容器里,有两个阶段无法改变的阶段,第一个阶段就是Pending(进行),第二个阶段就是结果阶段,包含Fulfilled(成功).Rejected(失败 ...

  5. Eclipse 笔记

    2004年前的开发架构:(操作系统+数据库+中间件+开发工具) AIX + DB2 + WAS + WSAD  ===  皇家级 UNIX/Linux + Oracle +BEA WebLogic + ...

  6. 【AI测试】也许这有你想知道的人工智能 (AI) 测试--第二篇

    概述此为人工智能 (AI) 测试第二篇 第一篇主要介绍了 人工智能测试.测试什么.测试数据等.第二篇主要介绍测试用例和测试报告.之后的文章可能具体介绍如何开展各项测试,以及具体项目举例如何测试.测试用 ...

  7. [linux] 进程五状态模型

    运行态:该进程正在执行:就绪态:进程做好了准备,只要有机会就开始执行:阻塞态:进程在某些事件发生前不能执行,如I/O 操作完成:新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中.通常是进 ...

  8. Alpha版本1

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/ 这个作业要求在哪里 https:// ...

  9. JS三座大山再学习 ---- 异步和单线程

    本文已发布在西瓜君的个人博客,原文传送门 前言 写这一篇的时候,西瓜君查阅了很多资料和文章,但是相当多的文章写的都很简单,甚至互相之间有矛盾,这让我很困扰:同时也让我坚定了要写出一篇好的关于JS异步. ...

  10. Python微信公众号开发—小白篇(1)

    本文面向想通过Python学习公众号开发的同学.一站式解决新手开发微信公众号遇到的所有问题. 为了防止我的文章被到处转载,贴一下我的公众号[智能制造社区],欢迎大家关注. github仓库地址http ...