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的更多相关文章

  1. 轻松学习java可重入锁(ReentrantLock)的实现原理

    转载自https://blog.csdn.net/yanyan19880509/article/details/52345422,(做了一些补充) 前言 相信学过java的人都知道 synchroni ...

  2. java 可重入锁ReentrantLock的介绍

    一个小例子帮助理解(我们常用的synchronized也是可重入锁) 话说从前有一个村子,在这个村子中有一口水井,家家户户都需要到这口井里打水喝.由于井水有限,大家只能依次打水.为了实现家家有水喝,户 ...

  3. 轻松学习java可重入锁(ReentrantLock)的实现原理(转 图解)

    前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...

  4. Java 重入锁 ReentrantLock 原理分析

    1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似.所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生 ...

  5. Java 显示锁 之 重入锁 ReentrantLock(七)

    ReentrantLock 重入锁简介 重入锁 ReentrantLock,顾名思义,就是支持同一个线程对资源的重复加锁.另外,该锁还支持获取锁时的公平与非公平性的选择. 重入锁 ReentrantL ...

  6. synchronized关键字,Lock接口以及可重入锁ReentrantLock

    多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...

  7. 17_重入锁ReentrantLock

    [概述] 重入锁可以完全代替synchronized关键字. 与synchronized相比,重入锁ReentrantLock有着显示的操作过程,即开发人员必须手动指定何时加锁,何时释放锁,所以重入锁 ...

  8. Java不可重入锁和可重入锁的简单理解

    基础知识 Java多线程的wait()方法和notify()方法 这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出Ille ...

  9. Java中可重入锁ReentrantLock原理剖析

    本文由码农网 – 吴极心原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQue ...

随机推荐

  1. Ambari架构源码解析

    1. Ambari介绍 Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应.管理和监控.Ambari已支持大多数Hadoop组件,包括HDFS.MapReduc ...

  2. MySQL针对对账数据,每天每个店只能产生一条对账记录,对数据库数据进行添加联合唯一索引设置

    ALTER TABLE StoreDailyCheck ADD UNIQUE INDEX(StoreId,CheckDate);

  3. VMware虚拟机CentOS7网络通信与无线上网

    实现主机和虚拟机网络通信 1.虚拟机设置 VMware界面最上面,选择[虚拟机]->[设置]:将网络连接改为"桥接模式",如下图所示: 2.CentOS7网络设置 自动获取I ...

  4. PyCharm 如何新建Django工程项目

    声明:本文使用的IDE是PyCharm 2018.1.2版. 一.File-New Project 二.选择工程类型 强烈建议选项"Pure Python",因为如果选择" ...

  5. IIS ip访问限制插件

    Dynamic IP Restrictions Overview The Dynamic IP Restrictions Extension for IIS provides IT Professio ...

  6. IIS 使用OpenSSL 生成的自签名证书,然后使用SingalR 客户端访问Https 站点通信

    使用SignalR 的客户端去发送消息给使用 https 部署的站点,官方文档目前并没有详细的教程,所以在此记录下步骤: 使用管理员身份打开cmd 窗口,选择一个整数保存文件夹的地址,切换到对应的文件 ...

  7. Linux中keepalived+LVS负载均衡的搭建测试

    1.1 LVS简介       LVS(Linux Virtual Server),也就是Linux虚拟服务器, 是一个自由软件项目.使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Lin ...

  8. esxi网络中虚拟机的相关操作

    一个虚拟机的克隆就是原始虚拟机全部状态的一个备份或镜像.克隆的过程不影响原始虚拟机.而快照指的是虚拟磁盘在某一特定时间点的副本.执行快照将保留虚拟机的状况和数据. 一.实验拓扑图: 目标:克隆虚拟机, ...

  9. Java反射机制小结和实际操作

    一.什么是反射 1.编译和运行 在了解什么是Java反射机制前,先聊聊Java的编译和运行. 还记得第一次使用记事本编写第一个Java程序的场景吗?通过命令窗口,使用javac命令编译一个.java文 ...

  10. HTTP Health Checks

    This article describes how to configure and use HTTP health checks in NGINX Plus and open source NGI ...