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. JS之表单提交时编码类型enctype详解

    简介 form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x- ...

  2. Python 标准类库-日期类型之datetime模块

    标准类库-日期类型之datetime模块    by:授客 QQ:1033553122 可用类型 3 实践出真知 4 timedelta对象 4 class datetime.timedelta(da ...

  3. Android 程序崩溃之后fragment出现画面重叠问题

    1.解决方法: 直接在包含Fragment的Activity中复写onSaveInstanceState()方法,使其空实现 @Override protected void onSaveInstan ...

  4. Django 2.0 URL新版配置介绍

    实例 先看一个例子: from django.urls import path from . import views urlpatterns = [ path('articles/2003/', v ...

  5. SQL Server如何用SQL实现一批字符串的全部组合

    在SQL Server中,如何用SQL去实现得到一批字符串的全部组合呢?这个是同事在实际需求当中遇到的一个问题,他的具体需求如下所示: 传入参数格式为'1,2,3,224,15,6'   'A,BC, ...

  6. mssql sqlserver 从指定字符串中获取数字的方法

    转自:http://www.maomao365.com/?p=6410 摘要: 下文主要分享从指定字符串或列中获取数字信息,如下所示: 实验环境:sql server 2000 ----编写sql函数 ...

  7. linux c 开发通用结构,框架

    转自:http://www.maomao365.com/?p=673 了解其它语言的框架例:java Struts1.Struts2.Hibernate.Mybatis.Ibatis.Spring 等 ...

  8. java POI导出Excel文件数据库的数据

    在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.这里我简单实现导出Excel文件. POI jar ...

  9. Scrapy at a glance预览

    1.安装scrapy 2.创建爬虫项目 scrapy startproject test_scrapy 3.创建quotes_spider.py文件4.复制下面代码到quotes_spider.py文 ...

  10. c/c++ 模板与STL小例子系列<二> 模板类与友元函数

    c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...