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 ...
随机推荐
- readLine()的注意点
我在用socket做即时通讯的时候,读取服务器返回的信息用了BufferedReader,用起来挺方便的. BufferedReader br = new BufferedReader(new Inp ...
- redis redis常用命令及内存分析总结(附RedisClient工具简介
redis常用命令及内存分析总结(附RedisClient工具简介 by:授客 QQ:1033553122 redis-cli工具 查看帮助 连接redis数据库 常用命令 exists key se ...
- VS code 配置为 Python R LaTeX IDE
VS code配置为Python R LaTeX IDE VS code的中文断行.编辑功能强大,配置简单. VSC的扩展在应用商店搜索安装,快捷键ctrl+shift+x调出应用商店. 安装扩展后, ...
- 深圳共创力“研发管理&知识管理”高端研讨交流会在深圳举办!
2017/4/8,由深圳市共创力企业管理咨询公司举办的“研发管理&知识管理”高端研讨会在深圳市南山区圣淘沙国际酒店(翡翠店)隆重召开.此次研讨会由共创力总经理.首席顾问杨学明先生主持.研讨会先 ...
- Android 官方DEMO BasicNetworking
本示例演示如何使用Android API检查网络连接. Demo下载地址:https://github.com/googlesamples/android-BasicNetworking/#readm ...
- DJANGO_SETTINGS_MODULE is undefined报错的解决
问题: ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is ...
- solidity高级理论(三):时间单位与view
solidity高级理论(三):时间单位与view 关键字:时间单位.view.Gas优化 solidity使用自己的本地时间单位 变量 now 将返回当前的unix时间戳(自1970年1月1日以来经 ...
- python创建列表和向列表添加元素方法
今天的学习内容是python中的列表的相关内容. 一.创建列表 1.创建一个普通列表 >>> tabulation1 = ['大圣','天蓬','卷帘'] >>> ...
- AI学习---TensorFlow框架介绍[图+会话+张量+变量OP+API]
TensorFlow的数据流图 TensorFlow的结构分析: 图 + 会话 TensorFlow = 构图阶段(数据与操作的执行步骤被描绘出一个图) + 执行图阶段(使用回话执行构建好的图中操作) ...
- windbg调试子进程
windbg 调试子进程 学习过程中遇到了一个从前未调试过的情景:我正在调试的进程通过CreateProcessW创建了一个子进程,我需要去了解子进程中发生的行为. 那么怎么去调试呢?OD 就有点麻烦 ...