文章目录

  • Java 可重入锁 & 不可重入锁
    • 概述
    • 论证synchronized是可重入锁:
    • 论证Lock是可重入锁:
    • 自定义不可重入锁:

Java 可重入锁 & 不可重入锁

概述

  • 可重入锁:指可以重复使用的同步锁。如:synchronized、Lock、ReentrantReadWriteLock.ReadLock、ReentrantReadWriteLock.WriteLock。
  • 不可重入锁:指不可以重复使用的同步锁。需要自定义锁。

论证synchronized是可重入锁:

public class Demo {public static void main(String[] args) {synchronized (Demo.class) {System.out.println("第一次获取锁");synchronized (Demo.class) {System.out.println("第二次获取锁");}}}
}

输出:

第一次获取锁
第二次获取锁

论证Lock是可重入锁:

public class Demo {public static void main(String[] args) {Lock lock = new ReentrantLock();lock.lock();try {System.out.println("第一次获取锁");lock.lock();try {System.out.println("第二次获取锁");} finally {lock.unlock();}} finally {lock.unlock();}}
}

输出:

第一次获取锁
第二次获取锁

自定义不可重入锁:

public class Demo {public static void main(String[] args) {MyLock lock = new MyLock();lock.lock();try {System.out.println("第一次获取锁");lock.lock();try {System.out.println("第二次获取锁");} finally {lock.unlock();}} finally {lock.unlock();}}
}class MyLock implements Lock {//绑定线程private Thread thread;@Overridepublic void lock() {synchronized (this) {while (thread != null) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}this.thread = Thread.currentThread();}}@Overridepublic void lockInterruptibly() throws InterruptedException {}@Overridepublic boolean tryLock() {return false;}@Overridepublic boolean tryLock(long l, TimeUnit timeUnit) throws InterruptedException {return false;}@Overridepublic void unlock() {synchronized (this) {if (thread != Thread.currentThread()) {return;}thread = null;notifyAll();}}@Overridepublic Condition newCondition() {return null;}
}

输出:

第一次获取锁

说明:只输出了一个打印信息,程序就进入等待阶段。

Java 可重入锁 不可重入锁相关推荐

  1. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  2. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...

    http://blog.51cto.com/13919357/2339446 Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容 ...

  3. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等

    Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互 ...

  4. java -锁(公平、非公平锁、可重入锁【递归锁】、自旋锁)

    1.公平锁.非公平锁 2.可重入锁(递归锁) 3.自旋锁 AtomicReference atomicReference = new AtomicReference();//原子引用线程 下面代码5秒 ...

  5. java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...

    一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...

  6. JAVA——以ReentrantLock为例学习重入锁以及公平性问题

    关注微信公众号:CodingTechWork,一起学习交流进步. 引言   重入锁,顾名思义在于这个重字.开发过程中,我们在用到锁时,可能会用于递归的方法上加锁,此时,那同一个方法对象去重复加锁,是怎 ...

  7. Java面试之锁-可重入锁和递归锁

    可重入锁和递归锁ReentrantLock 概念 可重入锁就是递归锁 指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取到该锁的代码. 在同一线程在外层方法获取锁的时候,在进入内层方法会自动获取 ...

  8. 测试Lock锁-可重入锁(Java)

    测试Lock锁-可重入锁(Java) package src.thread;import java.util.concurrent.locks.ReentrantLock;public class T ...

  9. 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】

    第二季:5值传递和引用传递[Java面试题] 前言 推荐 值传递 说明 题目 24 TransferValue醒脑小练习 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自 ...

  10. java中的锁(悲观锁、乐观锁、可重入锁、不可重入锁、公平锁、非公平锁、自旋锁、阻塞锁...)

    Lock接口 1.简介.地位.作用 ① 锁是一种工具,用于控制对共享资源的访问 ② Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用和功能上又有较大的不 ...

最新文章

  1. szu 寒训复习day #4数论入门详解[修改]用Mardown再改了一下
  2. 清空SQL Server日志
  3. Android开发之设置DialogFragment的窗体背景色的方法亲测可用
  4. 四、物理优化(4)分区视图
  5. [Axis2与Eclipse整合开发Web Service系列之一] 生成Web Service Client(将WSDl 转化成 Java代码)
  6. 是男人就下100层【第二层】——帮美女更衣(1)
  7. linux系统如何解压rar文件
  8. Bootstrap可视化布局
  9. 通达信日线数据转换为feather格式,提高后续数据处理速度
  10. html5微相册,微信开发 微信H5开发 微信小程序 微报名 微相册 微**
  11. 网络监控系统的建立及部署
  12. Hbuilder 运行到手机上找不到真机 解决办法
  13. 如何提取公积金 9 天到账
  14. 花书——PyTorch版本
  15. powerdesigner 导入sql文件生成模型
  16. MySQL自定义函数的使用及MySQL中的流程控制语句
  17. php如何写微信支付回调函数,php对微信支付回调处理的方法(合集)
  18. 银行表内表外业务图解
  19. 微信小程序函数无法运行或者出现报错“Component “页面路径“ does not have a method “ 方法名“ to handle event “tap“.”
  20. centos怎么样快速卸载mysql_CentOS下如何完全卸载MySQL?卸载自带的mysql

热门文章

  1. 文旅夜游景观设计的优势
  2. 安装OPhone SDK详细过程
  3. Elasticsearch -- search_after
  4. Java实习生面试题整理
  5. 使用 Sandcastle 生成代码帮助文档
  6. ati自定义分辨率_游戏自定义分辨率教学 (低配超高配福利)
  7. Caffe学习(7)——图像数据转换为db文件(leveldb/lmdb)
  8. 没有学不会的知识,只有不努力的傻子!!! 学习的过程很痛苦,不学习的日子是苦难!!! 只要坚持就没有学不会的东西!!!...
  9. assets_android,Android之资源打包方式——Assets
  10. 如何查看并准确找到占用GPU的程序