重入锁的学习 (ReentrantLock)
重入锁 :(ReentrantLock)
- 上锁 用reentrantLock.lock 方法 解锁 用reentrantLock.unlock 方法
- 上锁和解锁 必须配对 可以多重上锁
- ReentrantLock 是对 synchronized 的升级,synchronized 底层是通过 JVM 实现的,
- ReentrantLock 是通过 JDK 实现的,使⽤起来更加简单。
- 重⼊锁是指可以给同⼀个资源添加过个锁,并且解锁的⽅式与 synchronized 有区别,
- synchronized 的锁是线程执⾏完毕之后⾃动释放,ReentrantLock 的锁是通过开发者⼿动释放的。
import java.util.concurrent.locks.ReentrantLock;
public class Account implements Runnable {
private static int num;
private ReentrantLock reentrantLock = new ReentrantLock();
@Override
public void run() {
//上锁
reentrantLock.lock();
reentrantLock.lock();
num++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("您是第" + num + "位访客");
//解锁
reentrantLock.unlock();
reentrantLock.unlock();
}
}
public class Test {
public static void main(String[] args) {
Account account = new Account();
new Thread(account).start();
new Thread(account).start();
}
}

- 重⼊锁可中断,是指某个线程在等待获取锁的过程中可以主动终⽌线程,lockInterruptibly()。
- 重⼊锁具备限时性的特点,可以判断某个线程在⼀定的时间内能否获取锁。
- boolean tryLock(long time,TimeUnit unit) time:时间数值 unit:时间单位
- true 表示在该时段内能够获取锁,false 表示在该时段内⽆法获取锁。
- 当判断的时间小于休眠的时间时不能获取锁 否则可以
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock; public class TimeOut implements Runnable {
private ReentrantLock reentrantLock = new ReentrantLock(); @Override
public void run() {
try {
if (reentrantLock.tryLock(6, TimeUnit.SECONDS)) {
System.out.println(Thread.currentThread().getName() + "get lock");
Thread.sleep(5000);
} else {
System.out.println(Thread.currentThread().getName() + "not lock");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
reentrantLock.unlock();
}
}
public class Test01 {
public static void main(String[] args) {
TimeOut timeOut = new TimeOut();
new Thread(timeOut,"线程1").start();
new Thread(timeOut,"线程2").start();
}
}

重入锁的学习 (ReentrantLock)的更多相关文章
- 并发编程-concurrent指南-Lock-可重入锁(ReentrantLock)
可重入和不可重入的概念是这样的:当一个线程获得了当前实例的锁,并进入方法A,这个线程在没有释放这把锁的时候,能否再次进入方法A呢? 可重入锁:可以再次进入方法A,就是说在释放锁前此线程可以再次进入方法 ...
- JUC 一 ReentrantLock 可重入锁
java.util.concurrent.locks ReentrantLock即可重入锁,实现了Lock和Serializable接口 ReentrantLock和synchronized都是可重入 ...
- Java并发编程:自己动手写一把可重入锁
关于线程安全的例子,我前面的文章Java并发编程:线程安全和ThreadLocal里面提到了,简而言之就是多个线程在同时访问或修改公共资源的时候,由于不同线程抢占公共资源而导致的结果不确定性,就是在并 ...
- 深入理解java:2.3.2. 并发编程concurrent包 之重入锁/读写锁/条件锁
重入锁 Java中的重入锁(即ReentrantLock) 与JVM内置锁(即synchronized)一样,是一种排它锁. ReentrantLock提供了多样化的同步,比如有时间限制的同步(定 ...
- 轻松学习java可重入锁(ReentrantLock)的实现原理
转载自https://blog.csdn.net/yanyan19880509/article/details/52345422,(做了一些补充) 前言 相信学过java的人都知道 synchroni ...
- 轻松学习java可重入锁(ReentrantLock)的实现原理(转 图解)
前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...
- 重入锁 ReentrantLock (转)(学习记录)
重入锁(ReentrantLock)是一种递归无阻塞的同步机制.以前一直认为它是synchronized的简单替代,而且实现机制也不相差太远.不过最近实践过程中发现它们之间还是有着天壤之别. 以下是官 ...
- 从源码角度彻底理解ReentrantLock(重入锁)
目录 1.前言 2.AbstractQueuedSynchronizer介绍 2.1 AQS是构建同步组件的基础 2.2 AQS的内部结构(ReentrantLock的语境下) 3 非公平模式加锁流程 ...
- Java 显示锁 之 重入锁 ReentrantLock(七)
ReentrantLock 重入锁简介 重入锁 ReentrantLock,顾名思义,就是支持同一个线程对资源的重复加锁.另外,该锁还支持获取锁时的公平与非公平性的选择. 重入锁 ReentrantL ...
随机推荐
- 【疑难杂症】windows下如何有效重装印象笔记
重装这么简单的操作还用得着写篇文章吗??emmmm,言之有理,简单的重装就是卸载后重新下载最新的安装包然后安装就完事了,这里说的肯定是不简单的重装[滑稽]. 背景是这样的,之前在mac上对印象笔记的笔 ...
- Spring中的配置文件文件位置
在Java开发中,一般在Spring框架中,classpath的位置是指src下,在IDEA中一般是指resource中 配置文件 位置:任意,开发中一般在classpath下(src) 名称:任意, ...
- MySql EF事务using不会自动 Rollback的bug
EF to MySql一般都是用using最后Commit,一直以为最后没Commit,当using调用Dispose会自动Rollback,没想到这儿有个坑,mysql有个bug并不会Rollbac ...
- 如何搭建一个vue项目(完整步骤)
参考资料 一.安装node环境 1.下载地址为:https://nodejs.org/en/ 2.检查是否安装成功:如果输出版本号,说明我们安装node环境成功 3.为了提高我们的效率,可以使用淘宝的 ...
- Win10自动更新关闭方法
一.为什么很多人会选择禁用Win10自动更新? 1.win10自动更新定义: Win 10的自动更新功能,即 Windows Update.这项功能本意是为一些软件.漏洞等提供更新服务.一般来说,只要 ...
- 数字IC前后端设计中的时序收敛(三)--Hold违反的修复方法
本文转自:自己的微信公众号<数字集成电路设计及EDA教程>(二维码见博文底部) 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教 ...
- Java基础之增强for循环
平时大家for循环应该用的不少,特别是增强for循环,简单快捷.但是在增强for中做删除操作,却会抛出java.util.ConcurrentModificationException,一起来看下. ...
- C# 使用Quartz简单实例以及备忘
一.导入NuGet 二.创建一个类并实现接口Ijob,并实现该接口中的方法. using Buday.Gold.Cusumer.Lib; using Quartz; using System; us ...
- Bzoj 3166 [Heoi2013] Alo 题解
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1118 Solved: 518[Submit][Status ...
- C语言指针专题——为何要学习指针
欢迎转发本文! 之前的文章与各位谈论了指针是什么,以及指针为何这那么难学.不少知友留言说看了我的文章对指针了解了不少,这给我继续创作提供了莫大的动力啊.指针其实就是一个纸老虎,你看着可怕,等你了解其本 ...