java可重入锁reentrantlock
public class ReentrantDemo {
//重入锁 保护临界区资源count,确保多线程对count操作的安全性
/*public static ReentrantLock rtlock = new ReentrantLock();
public static int count = 0;
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<100000;i++){
rtlock.lock();
try{
count++;
}finally {
rtlock.unlock();
}
}
}
});*/
//重入锁 对于死锁的中断响应
public static ReentrantLock rtlock1 = new ReentrantLock();
public static ReentrantLock rtlock2 = new ReentrantLock();
private int lock;
public ReentrantDemo(int lock){
this.lock = lock;
}
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try{
if(lock == ){
/*
当两个线程同时通过lock.lockInterruptibly()想获取某个锁时,假若此时线程A获取到了锁,
而线程B只有等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程
注意是:等待的那个线程B可以被中断,不是正在执行的A线程被中断
*/
rtlock1.lockInterruptibly();
try{
Thread.sleep();
}catch (InterruptedException e){
}
rtlock2.lockInterruptibly();
}
else{
rtlock2.lockInterruptibly();
try{
Thread.sleep();
}catch (InterruptedException e){
}
rtlock1.lockInterruptibly();
}
}catch (InterruptedException e){
e.getMessage();
}finally {
if(rtlock1.isHeldByCurrentThread())
rtlock1.unlock();
if(rtlock2.isHeldByCurrentThread())
rtlock2.unlock();
System.out.println("线程退出:" + Thread.currentThread().getName());
}
}
});
public static void main(String[] args) throws InterruptedException{
/*ReentrantDemo rtd = new ReentrantDemo();
Thread t1 = new Thread(rtd.t);
Thread t2 = new Thread(rtd.t);
Thread t3 = new Thread(rtd.t);
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println(count);*/
/*
避免死锁的方法:1. 外部方法,通过中断避免死锁
2. 锁申请限时等待
3. ReentrantLock.tryLock()
*/
ReentrantDemo rtd1 = new ReentrantDemo();
ReentrantDemo rtd2 = new ReentrantDemo();
Thread t1 = new Thread(rtd1.t);
Thread t2 = new Thread(rtd2.t);
t1.start();
t2.start();
Thread.sleep();
//t2中断 释放资源
t2.interrupt();
}
}
java可重入锁reentrantlock的更多相关文章
- 轻松学习java可重入锁(ReentrantLock)的实现原理
转载自https://blog.csdn.net/yanyan19880509/article/details/52345422,(做了一些补充) 前言 相信学过java的人都知道 synchroni ...
- java 可重入锁ReentrantLock的介绍
一个小例子帮助理解(我们常用的synchronized也是可重入锁) 话说从前有一个村子,在这个村子中有一口水井,家家户户都需要到这口井里打水喝.由于井水有限,大家只能依次打水.为了实现家家有水喝,户 ...
- 轻松学习java可重入锁(ReentrantLock)的实现原理(转 图解)
前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...
- Java 重入锁 ReentrantLock 原理分析
1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似.所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生 ...
- Java 显示锁 之 重入锁 ReentrantLock(七)
ReentrantLock 重入锁简介 重入锁 ReentrantLock,顾名思义,就是支持同一个线程对资源的重复加锁.另外,该锁还支持获取锁时的公平与非公平性的选择. 重入锁 ReentrantL ...
- synchronized关键字,Lock接口以及可重入锁ReentrantLock
多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...
- 17_重入锁ReentrantLock
[概述] 重入锁可以完全代替synchronized关键字. 与synchronized相比,重入锁ReentrantLock有着显示的操作过程,即开发人员必须手动指定何时加锁,何时释放锁,所以重入锁 ...
- Java不可重入锁和可重入锁的简单理解
基础知识 Java多线程的wait()方法和notify()方法 这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出Ille ...
- Java中可重入锁ReentrantLock原理剖析
本文由码农网 – 吴极心原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQue ...
随机推荐
- GIS开发之数据查询
在GIS开发之我们经常会用到属性查询和空间查询,特别是在数据量比较大的时候,如何提高查询效率成为一个问题 1.属性查询 对于属性查询,除了必要的建索引之外,我们还应该考虑使用字段缓存:减少查询字段,减 ...
- 判断字符串a和b是否互为旋转词
旋转词:把字符串str的任意部分移动到后面形成的新字符串叫做字符串str的旋转词. 比如abc的旋转词有 abc,acb,cba,... 判断str1和str2是否互为旋转词,其最优解可以是时间复杂度 ...
- 浅谈Kotlin(四):控制流
浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 本篇介绍Kotlin ...
- WordCount作业修改
WordCount作业修改 github地址 需求说明 基本需求 功能说明 PSP 代码实现 字符总数查询 单词数查询 行数查询 总结 一.需求说明 1.基本需求 WordCount的需求可以概括为: ...
- 使用IEDriverServer.exe驱动IE11,实现自动化测试
+ 下载IEDriverServer http://dl.pconline.com.cn/download/771640-1.html 解压缩得到IEDriverServer.e ...
- Linux下Wheel用户组介绍
昨天遇到一个很奇怪的事情,有一台服务器在使用su - root命令切换到root账号时,老是报密码不正确.但是root密码完全是正确的,而且可以使用账号密码直接ssh登录服务器.很是纳闷,如下所示: ...
- js获取地址栏中的数据
window.location.href:设置或获取整个 URL 为字符串window.location.pathname:设置或获取对象指定的文件名或路径window.location.search ...
- C# -- 接口 (关键字:interface)
C#: 接口(关键字:interface) 1.代码(入门举例) class Program { static void Main(string[] args) { Console.WriteLine ...
- puppet 横向扩展(一)
目录 1. 概述 2. 实验环境 3. 实验步骤 3.1. 创建puppetmaster的rack环境 3.2. 配置文件设置 3.3. 补充说明 3.4. 测试配置结果 3.4.1. 默认的负载均衡 ...
- intellij IDEA导入java源码
第一步: 从安装的jdk目录中找到src.zip文件, 这里是java源码的压缩包 第二步: 打开IDEA, 随便一个java相关项目,打开右上角的project structure 第三步: 点开源 ...