重入锁  :(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)的更多相关文章

  1. 并发编程-concurrent指南-Lock-可重入锁(ReentrantLock)

    可重入和不可重入的概念是这样的:当一个线程获得了当前实例的锁,并进入方法A,这个线程在没有释放这把锁的时候,能否再次进入方法A呢? 可重入锁:可以再次进入方法A,就是说在释放锁前此线程可以再次进入方法 ...

  2. JUC 一 ReentrantLock 可重入锁

    java.util.concurrent.locks ReentrantLock即可重入锁,实现了Lock和Serializable接口 ReentrantLock和synchronized都是可重入 ...

  3. Java并发编程:自己动手写一把可重入锁

    关于线程安全的例子,我前面的文章Java并发编程:线程安全和ThreadLocal里面提到了,简而言之就是多个线程在同时访问或修改公共资源的时候,由于不同线程抢占公共资源而导致的结果不确定性,就是在并 ...

  4. 深入理解java:2.3.2. 并发编程concurrent包 之重入锁/读写锁/条件锁

    重入锁 Java中的重入锁(即ReentrantLock)   与JVM内置锁(即synchronized)一样,是一种排它锁. ReentrantLock提供了多样化的同步,比如有时间限制的同步(定 ...

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

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

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

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

  7. 重入锁 ReentrantLock (转)(学习记录)

    重入锁(ReentrantLock)是一种递归无阻塞的同步机制.以前一直认为它是synchronized的简单替代,而且实现机制也不相差太远.不过最近实践过程中发现它们之间还是有着天壤之别. 以下是官 ...

  8. 从源码角度彻底理解ReentrantLock(重入锁)

    目录 1.前言 2.AbstractQueuedSynchronizer介绍 2.1 AQS是构建同步组件的基础 2.2 AQS的内部结构(ReentrantLock的语境下) 3 非公平模式加锁流程 ...

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

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

随机推荐

  1. 点菜网---Java开源生鲜电商平台-商品基础业务架构设计-商品分类(源码可下载)

    点菜网---Java开源生鲜电商平台-商品基础业务架构设计-商品分类 (源码可下载) 说明:我们搞过电商的人都可以体会到,搞生鲜电商是最复杂的,为什么复杂呢?我总结了有以下几个业务特性决定的: 1. ...

  2. CCPC2019江西省赛-Problem G.Traffic

    题目描述: /*纯手打题面*/ Avin is observing the cars at a crossroads.He finds that there are n cars running in ...

  3. V语言横空出世,C/C++/Java/Python/Go地位不保

    V语言已在github正式开源,目前已收获近9000星,引发开发者的强烈关注. V语言到底是怎样一门语言?已经有了C/C++/Java/Python/Go..., 我们还需要另外一门语言吗? 先看看V ...

  4. 高并发架构系列:Redis缓存和MySQL数据一致性方案详解

    一.需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景, ...

  5. 并发编程-concurrent指南-原子操作类-AtomicLong

    可以用原子方式更新的 long 值.有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范.AtomicLong 可用在应用程序中(如以原子方式增加的序列号), ...

  6. 正确写网站title、keywords、description

    一.title title,也就是标题,是在浏览器上面显示出来的,方便用户了解这个页面的内容;特别是搜索引擎判断你网页内容的主要根据.搜索引擎就很大部分是依靠网站title来判断你网站是关于什么内容的 ...

  7. 源码阅读 - java.util.concurrent (一)

    java.util.concurrent这个包大致可以分为五个部分: Aomic数据类型 这部分都被放在java.util.concurrent.atomic这个包里面,实现了原子化操作的数据类型,包 ...

  8. cookie 和 session 设置

    cookie: 保存在浏览器上的一组键值对, 是由服务器让浏览器进行设置的 下次浏览器访问的时候会携带cookie. request是客户端请求, response是服务端响应. 读取客户端的cook ...

  9. kuangbin专题 专题一 简单搜索 Prime Path POJ - 3126

    题目链接:https://vjudge.net/problem/POJ-3126 题意:给你两个四位的素数N,M,每次改变N四位数中的其中一位,如果能经过有限次数的替换变成四位数M,那么求出最少替换次 ...

  10. struts2入门Demo

    一.引入必要的jar包,所需jar包如下: 二.配置web.xml.主要目的是拦截请求 <?xml version="1.0" encoding="UTF-8&qu ...