lockInterruptibly()方法能够中断等待获取锁的线程。当两个线程同时通过lock.lockInterruptibly()获取某个锁时,假若此时线程A获取到了锁,而线程B只有等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程。

示例:

要执行doBussiness()中的代码首先需要得到锁lock,线程使用lockInterruptibly()方法获取锁。

如下示例中,t0得到了锁,t1等待。在t1等待时,调用t1.interrupt(),中断t1的等待。

public class LockTest {

    private Lock lock = new ReentrantLock();

    public void doBussiness() {
String name = Thread.currentThread().getName(); try {
System.out.println(name + " 开始获取锁");
lock.lockInterruptibly();
System.out.println(name + " 得到锁");
System.out.println(name + " 开工干活");
for (int i=0; i<5; i++) {
Thread.sleep(1000);
System.out.println(name + " : " + i);
}
} catch (InterruptedException e) {
System.out.println(name + " 被中断");
System.out.println(name + " 做些别的事情");
} finally {
try {
lock.unlock();
System.out.println(name + " 释放锁");
} catch (Exception e) {
System.out.println(name + " : 没有得到锁的线程运行结束");
}
}
} public static void main(String[] args) throws InterruptedException { LockTest lockTest = new LockTest(); Thread t0 = new Thread(
new Runnable() {
public void run() {
lockTest.doBussiness();
}
}
); Thread t1 = new Thread(
new Runnable() {
public void run() {
lockTest.doBussiness();
}
}
); // 启动线程t1
t0.start();
Thread.sleep(10);
// 启动线程t2
t1.start();
Thread.sleep(100);
// 线程t1没有得到锁,中断t1的等待
t1.interrupt();
}
}

运行结果:

Thread-0 开始获取锁
Thread-0 得到锁
Thread-0 开工干活
Thread-1 开始获取锁
Thread-1 被中断
Thread-1 做些别的事情
Thread-1 : 没有得到锁的线程运行结束
Thread-0 : 0
Thread-0 : 1
Thread-0 : 2
Thread-0 : 3
Thread-0 : 4
Thread-0 释放锁

如果使用lock()方法获取锁,线程不会被中断。

lock.lockInterruptibly();

改为

lock.lock();

运行结果如下:

Thread-0 开始获取锁
Thread-0 得到锁
Thread-0 开工干活
Thread-1 开始获取锁
Thread-0 : 0
Thread-0 : 1
Thread-0 : 2
Thread-0 : 3
Thread-0 : 4
Thread-1 得到锁
Thread-1 开工干活
Thread-1 被中断
Thread-1 做些别的事情
Thread-1 释放锁
Thread-0 释放锁

Lock的lockInterruptibly()方法的更多相关文章

  1. java中的 java.util.concurrent.locks.ReentrantLock类中的lockInterruptibly()方法介绍

    在java的 java.util.concurrent.locks包中,ReentrantLock类实现了lock接口,lock接口用于加锁和解锁限制,加锁后必须释放锁,其他的线程才能进入到里面执行, ...

  2. java并发-ReentrantLock的lock和lockInterruptibly的区别

    ReentrantLock的加锁方法Lock()提供了无条件地轮询获取锁的方式,lockInterruptibly()提供了可中断的锁获取方式.这两个方法的区别在哪里呢?通过分析源码可以知道lock方 ...

  3. TortoiseSVN里锁lock 的使用方法

    刚才试验了一下,终于搞明白了TortoiseSVN里锁lock 的使用方法. 简单的说,如果压根没有锁lock,那么每个人都拥有一个本地copy,每个人都能自由地对本地copy编辑edit并提交com ...

  4. C# 关于线程锁lock的使用方法

    C# 关于线程锁lock的使用方法 原创 2016年09月02日 10:07:05 标签: c# / 线程 / 锁 / lock 11937 在多线程编程中,可能会有许多线程并发的执行一段代码(代码块 ...

  5. 关于ReentrantLock 中的lockInterruptibly方法的简单探究

    今天在看Lock,都知道相比于synchronized,多了公平锁,可中断等优秀性能. 但是说到可中断这个特点,看到很多博客是这么描述的: “与synchronized关键字不同,获取到锁的线程能够响 ...

  6. Hibernate.lock()方法中各种锁的区别

    悲观锁 它指的是对数据被外界修改持保守态度.假定任何时刻存取数据时,都可能有另一个客户也正在存取同一笔数据,为了保持数据被操作的一致性,于是对数据采取了数据库层次的锁定状态,依靠数据库提供的锁机制来实 ...

  7. 解决Visual Studio 2010/2012在调试时lock文件的方法

    调试3dsmax插件,有一个避免每次修改插件代码都需要重启3dsmax的方法,就是将导出的核心代码写在一个独立的DLL中,然后在插件代码需要导出时LoadLibrary这个DLL,导出之后再FreeL ...

  8. .NET中lock的使用方法及注意事项

    lock就是把一段代码定义为临界区,所谓临界区就是同一时刻只能有一个线程来操作临界区的代码,当一个线程位于代码的临界区时,另一个线程不能进入临界区,如果试图进入临界区,则只能一直等待(即被阻止),直到 ...

  9. Could not get lock /var/lib/dpkg/lock - open 解决方法

    无法获得锁 /var/lib/dpkg/lock E: Could not get lock /var/lib/dpkg/lock - open (11 Resource temporarily un ...

随机推荐

  1. C# 文件/文件夹压缩解压缩

    项目上用到的,随手做个记录,哈哈. 直接上代码: using System; using System.Data; using System.Configuration; using System.C ...

  2. linux软件管理之rpm管理rpm包

    使用RPM工具管理RPM包 ====================================================================================需要 ...

  3. .net core部署到Ubuntu

    1.使用vs2017创建Asp.net Core Web应用程序,选择ubuntu中安装的.net core版本,这里选择2.1版本: 2.右键发布该项目,选择文件系统发布: 3.在ubuntu中安装 ...

  4. css3实现好看的边框效果

    1.html结构 <div class="box">box</div> <br> <div class="border1&quo ...

  5. Oracle 11g 静默安装脚本

    #!/bin/bash####安装Oracle所需依赖包function install_yum(){  yum -y install $1} i="perl-Data-Dumper lvm ...

  6. Ubuntu系统下安装免驱动摄像头

    最近想玩一下视频系列的深度学习模型,便网上淘了一个linux下免驱动的摄像头,直接插上usb接口就行,但是一般还不能直接使用,下面将简单说一下如何使用摄像头: 在你的ternimal下输入以下命令: ...

  7. Core 配置文件Json

    appsettings.json 文件属性 -复制到输出目录-始终复制.

  8. Python基础06_list

    尽量多挤点时间用来学点知识吧. list是不同于字符串的,字符串定义后不可修改,而list是可以修改的. 以下是学习笔记: #!/usr/bin/env python # coding:utf-8 l ...

  9. ios中模态弹窗用法及UINavigationController基本用法

    - (void)viewDidLoad { [super viewDidLoad]; //点击按钮跳转 loginViewController *vc=[[loginViewController al ...

  10. sublime text 使用小技巧

    sublime下载各个版本 官网 插件官方网站地址 https://packagecontrol.io/ 一.安装设置字体及字体大小 1.点菜单“Preferences--->Setting - ...