重入锁  :(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. CSS3边框与圆角

    1. CSS3 圆角 border-radius 属性 一个最多可指定四个border -*- radius属性的复合属性,这个属性允许你为元素添加圆角边框!语法:border-radius: 1-4 ...

  2. python的自定义函数

    今天想把上次参考着网上教程写的scrapy爬虫改写成requests和beautifulsoup的普通爬虫,写着写着发现自己对python的自定义函数还不是太熟悉(自己TCL了.........流泪) ...

  3. 【HDU - 1495】非常可乐

    -->非常可乐  Descriptions: 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一 ...

  4. 5分钟快速部署ownCloud私有云盘存储系统

    ownCloud 是一个开源免费专业的私有云存储项目,它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘,可以像 Dropbox 那样实现文件跨平台同步.共享.版本控制.团队协作等等.o ...

  5. Tell Don’t Ask

    The Tell, Don’t Ask (TDA) principle suggests that it is better to issue an object a command do perfo ...

  6. Vs连接Mysql数据库

    Vs连接Mysql数据库步骤 1. 首先下载mysql数据库,安装,建库建表 https://www.yiibai.com/mysql/getting-started-with-mysql-store ...

  7. Nginx正向代理和反向代理

    关于代理 说到代理,首先我们要明确一个概念,所谓代理就是一个代表.一个渠道: 此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过 ...

  8. 奇袭(单调栈+分治+桶排)(20190716 NOIP模拟测试4)

    C. 奇袭 题目类型:传统 评测方式:文本比较 内存限制:256 MiB 时间限制:1000 ms 标准输入输出   题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而 ...

  9. blast2go本地化 mysql_study

    mysql yum -y install mysql mysqladmin -uroot -passwd "oebiotech" mysql -uroot -poebiotech ...

  10. [原创]SSH Tunnel for UDP

    SSH Tunnel for UDP UDP port forwarding is a bit more complicated. We will need to convert the packet ...