ReentrantLock中的lockInterruptibly()方法使得线程可以在被阻塞时响应中断,比如一个线程t1通过lockInterruptibly()方法获取到一个可重入锁,并执行一个长时间的任务,另一个线程通过interrupt()方法就可以立刻打断t1线程的执行,来获取t1持有的那个可重入锁。而通过ReentrantLock的lock()方法或者Synchronized持有锁的线程是不会响应其他线程的interrupt()方法的,直到该方法主动释放锁之后才会响应interrupt()方法。下面看一个示例:

package com.lsl.common.lang;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock; /**
* 测试ReentrantLock可中断锁的效果
*/
public class ThreadInteruptExample {
ReentrantLock lock1=new ReentrantLock();
ReentrantLock lock2=new ReentrantLock(); /**
* ReentrantLock响应中断
* @throws Exception
*/
public void reentrantLockInterupt() throws Exception{
Thread t1=new Thread(new ReentrantLockTask(lock1,lock2));
Thread t2=new Thread(new ReentrantLockTask(lock2,lock1));
t1.start();
t2.start();
System.out.println(t1.getName()+"中断");
//主线程睡眠1秒,避免线程t1直接响应run方法中的睡眠中断
Thread.sleep(1000);
t1.interrupt();
//阻塞主线程,避免所有线程直接结束,影响死锁效果
Thread.sleep(10000);
} /**
* Synchronized响应中断
* @throws Exception
*/
public void synchronizedInterupt() throws Exception{
Object syn1=new Object();
Object syn2=new Object();
Thread t1=new Thread(new SynchronizedTask(syn1,syn2));
Thread t2=new Thread(new SynchronizedTask(syn2,syn1));
t1.start();
t2.start();
System.out.println(t1.getName()+"中断");
//主线程睡眠1秒,避免线程t1直接响应run方法中的睡眠中断
Thread.sleep(1000);
t1.interrupt();
//阻塞主线程,避免所有线程直接结束,影响死锁效果
Thread.sleep(1000);
} /**
* ReentrantLock实现死锁
*/
static class ReentrantLockTask implements Runnable{ ReentrantLock lock1;
ReentrantLock lock2; public ReentrantLockTask(ReentrantLock lock1, ReentrantLock lock2){
this.lock1=lock1;
this.lock2=lock2;
} @Override
public void run() {
try {
//可中断的获取锁
lock1.lockInterruptibly();
//lock1.lock();
//睡眠200毫秒,保证两个线程分别已经获取到两个锁,实现相互的锁等待
TimeUnit.MILLISECONDS.sleep(200);
//lock2.lock();
//可中断的获取锁
lock2.lockInterruptibly();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock1.unlock();
lock2.unlock();
System.out.println("线程"+Thread.currentThread().getName()+"正常结束");
} }
} /**
* Synchronized实现死锁
*/
static class SynchronizedTask implements Runnable{ Object lock1;
Object lock2; public SynchronizedTask(Object lock1, Object lock2){
this.lock1=lock1;
this.lock2=lock2;
} @Override
public void run() {
try {
synchronized (lock1){
//睡眠200毫秒,再获取另一个锁,
//保证两个线程分别已经获取到两个锁,实现相互的锁等待
Thread.sleep(200);
synchronized (lock2){
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("线程"+Thread.currentThread().getName()+"正常结束");
} }
} public static void main(String[] args) throws Exception {
ThreadInteruptExample demo=new ThreadInteruptExample();
ThreadInteruptExample demo1=new ThreadInteruptExample();
demo.reentrantLockInterupt();
demo1.synchronizedInterupt();
} }

  响应中断

执行完毕才响应中断-现象死锁

ReentrantLock可中断锁和synchronized区别的更多相关文章

  1. ReenTrantLock可重入锁和synchronized的区别

    ReenTrantLock可重入锁和synchronized的区别 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入 ...

  2. ReentrantLock详解 以及与synchronized的区别

    ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁 ReentrantLock lock = new ReentrantLock(tr ...

  3. 面试官:你说说ReentrantLock和Synchronized区别

    大家好!又和大家见面了.为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区别! 使用方式 Synchronized可以修饰实例方法,静态方法,代码块. ...

  4. ReentrantLock和synchronized区别和联系?

    相同:ReentrantLock提供了synchronized类似的功能和内存语义,都是可重入锁. 不同: 1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此 ...

  5. (转)Synchronized(对象锁)和Static Synchronized(类锁)的区别

    场景:面试的时候经常用得到! 1 综述 Synchronized和Static Synchronized区别 一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全 ...

  6. 聊聊ReentrantLock基于AQS的公平锁和非公平锁的实现区别

    ReentrantLock锁的实现是基于AQS实现的,所以先简单说下AQS: AQS是AbstractQueuedSynchronizer缩写,顾名思义:抽象的队列同步器,它是JUC里面许多同步工具类 ...

  7. Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁

    (1)synchronized 是互斥锁: (2)ReentrantLock 顾名思义 :可重入锁 (3)ReadWriteLock :读写锁 读写锁特点: a)多个读者可以同时进行读b)写者必须互斥 ...

  8. JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁,

    如果需要查看具体的synchronized和lock的实现原理,请参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度) 在并发编程中,经常遇到多个线程访问同一个 ...

  9. java并发之Lock以及和synchronized区别

    从Java5之后,在Java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock. 1.Lock 首先要说明的就是Lock,通过查看Lock的源码可知,Lo ...

随机推荐

  1. 毒瘤dp 学校食堂

    这道dp题 可谓是比较难了,我想了2h 总是觉得自己设的状态没有包涵全部的状态空间 一直想不出来状态 最后败北. 正解是这样的 我们肯定是有一维i的表示 到了i 这个人吃饭了 但是在i吃饭之前后面的7 ...

  2. SpringBoot2 整合 Swagger2文档 使用BootstrapUI页面

    SpringBoot2 整合 Swagger2 SpringBoot整合三板斧 第一步.引入pom <dependency> <groupId>com.spring4all&l ...

  3. x86架构: 硬件启动过程分析(附引导启动代码)

    用户按下开机键,几秒的时间,都经历了啥? 1.cpu各个寄存器赋初始值,cs.base=0xffff0000, eip=0xfff0,其他寄存器都是0,这时cs:ip得到的物理地址:0xfffffff ...

  4. stm32f407 oled iic例程,成功点亮oled屏

    写了好久好久,写好多好多代码,终于把oled给驱起来了.话不多说,直接上图,欲要例程的,可以加我微 lichenpoo

  5. 久等了,你要的 Python 书籍推荐,来了

    前言 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家提供 ...

  6. CSS高级特效(下)

    3.混合模式与合成 在图形编辑软件(比如Photoshop)中,设计师很早就可以选择两个设计元素叠加时的颜色如何混合了. CSS Compositing and Blending标准使我们可以在CSS ...

  7. Python基础入门知识点——Python中的异常

    前言 在先前的一些章节里你已经执行了一些代码,你一定遇到了程序“崩溃”或因未解决的错误而终止的情况.你会看到“跟踪记录(traceback)”消息以及随后解释器向你提供的信息,包括错误的名称.原因和发 ...

  8. LDA线性判别分析原理及python应用(葡萄酒案例分析)

    目录 线性判别分析(LDA)数据降维及案例实战 一.LDA是什么 二.计算散布矩阵 三.线性判别式及特征选择 四.样本数据降维投影 五.完整代码 结语 一.LDA是什么 LDA概念及与PCA区别 LD ...

  9. java 二分查找的注意事项

    二分查找也是最简单的算法之一了.但是最近发现一般的写法会有问题. public int search(int[] nums, int target) { int left = 0; int right ...

  10. StructuredStreaming编程模型

    StructuredStreaming编程模型 基本概念 ◆ Time ◆ Trigger ◆ Input ◆ Query ◆ Result ◆ Output  案例模型:实时处理流单词统计编程模型 ...