当前位置: 首页 > news >正文

synchronized锁重入验证

文章目录

  • synchronized锁重入验证
  • 1. 可重入锁
  • 2. synchronized锁重入
    • 2.1 本类同步方法内部调用本类其它同步方法
    • 2.2 子类同步方法内部调用父类的同步方法
    • 2.3 A类的同步方法内部调用B类的同步方法
  • 3. synchronized修饰方法写法

synchronized锁重入验证

1. 可重入锁

可重入锁:也叫递归锁,指的是同一线程的外层函数获得锁之后,内层递归函数仍然能获取该锁的代码。

即同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。线程可以进入任何一个它已经拥有的锁所同步着的代码块。

2. synchronized锁重入

synchronized是支持锁重入的,是可重入锁。

  • 同一线程在本类同步方法内部可以调用本类其它同步方法
  • 同一线程子类同步方法内部可以调用父类的同步方法
  • 同一线程在A类的同步方法内部可以调用B类的同步方法

2.1 本类同步方法内部调用本类其它同步方法

同一线程在本类同步方法内部可以调用本类其它同步方法

SyncObjMthod类:

public class SyncObjMthod {synchronized public void method1(){System.out.println("线程 "+Thread.currentThread().getName()+"\t调用 method1...");method2();}synchronized public void method2(){System.out.println("线程 "+Thread.currentThread().getName()+"\t调用 method2...");method3();}synchronized public void method3(){System.out.println("线程 "+Thread.currentThread().getName()+"\t调用 method3...");}
}

TestSyncRenntry测试类:

public class TestSyncRenntry {public static void main(String[] args) {new Thread(() -> {SyncObjMthod syncObjMthod = new SyncObjMthod();syncObjMthod.method1();}, "AAA").start();;}
}

输出结果:

线程 AAA	调用 method1...
线程 AAA	调用 method2...
线程 AAA	调用 method3...

2.2 子类同步方法内部调用父类的同步方法

同一线程子类同步方法内部可以调用父类的同步方法

父类Father:

public class Father {public int i =10;public synchronized void fatherMethod(){try {i--;System.out.println("线程 "+Thread.currentThread().getName()+"\t调用 fatherMethod i="+i);TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}}
}

子类Sub:

public class Sub extends Father {public synchronized void subMethod() {try {while (i > 0) {i--;System.out.println("线程 "+Thread.currentThread().getName()+"\t调用 subMethod i=" + i);TimeUnit.SECONDS.sleep(5);this.fatherMethod();}} catch (InterruptedException e) {e.printStackTrace();}}
}

测试类TestSyncRenntry1:

public class TestSyncRenntry1 {public static void main(String[] args) {new Thread(()->{Sub sub = new Sub();sub.subMethod();},"BBB").start();}
}

输出结果:

线程 BBB	调用 subMethod i=9
线程 BBB	调用 fatherMethod i=8
线程 BBB	调用 subMethod i=7
线程 BBB	调用 fatherMethod i=6
线程 BBB	调用 subMethod i=5
线程 BBB	调用 fatherMethod i=4
线程 BBB	调用 subMethod i=3
线程 BBB	调用 fatherMethod i=2
线程 BBB	调用 subMethod i=1
线程 BBB	调用 fatherMethod i=0

2.3 A类的同步方法内部调用B类的同步方法

同一线程在A类的同步方法内部可以调用B类的同步方法

public class A {B b = new B();public synchronized void method(){System.out.println("线程 "+Thread.currentThread().getName()+"\t调用 A类 method方法");b.method();}
}
public class B {public synchronized void method(){System.out.println("线程 "+Thread.currentThread().getName()+"\t调用 B类 method方法");}
}
public class TestDemo1 {public static void main(String[] args) {new Thread(()->{A a = new A();a.method();},"CCC").start();}
}
线程 CCC	调用 A类 method方法
线程 CCC	调用 B类 method方法

3. synchronized修饰方法写法

synchronized修饰方法的写法:

  1. 第一种
synchronized public void method1(){}
  1. 第二种
public synchronized void method1(){}
http://www.lryc.cn/news/25045.html

相关文章:

  • 超简单的计数排序!!
  • 发现新大陆——原来软件开发根本不需要会编码(看我10分钟应用上线)
  • 【Leedcode】栈和队列必备的面试题(第二期)
  • Elasticsearch实战之(商品搜索API实现)
  • 剑指 Offer 14-剪绳子
  • 泰克示波器|MSO64示波器的应用
  • 1.4 黑群晖安装:SataPortMap和DiskIdxMap两种获取方式
  • JVM虚拟机概述(2)
  • Intel CSME 简述
  • 复位理论基础
  • Python基础知识——列表
  • 如何使用工时表管理项目和非项目的资源?
  • 项目经理如何做好质量保证与标准维持?非技术项目经理如何做好质量管控?
  • [文件操作] File 类的用法和 InputStream, OutputStream 的用法
  • 索莫菲模型的一些理解 Smomerfeld Model
  • SAP ERP系统MM模块常用增强之四:采购申请输入字段的校验检查
  • STM32C0介绍(1)----概述
  • windows无盘启动技术开发之传统BIOS(Legacy BIOS)引导程序开发之一
  • mysql实现if语句判断功能的六种使用形式
  • 在Vue3这样子写页面更快更高效
  • 做软件测试,如何才能实现月入20K?
  • mysql last lesson
  • 一、Redis入门概述(是什么,能干嘛,去哪下,怎么玩)
  • (六十二)当我们在SQL里进行分组的时候,如何才能使用索引?
  • python字符串练习
  • Java-封装、继承、多态
  • 问题三十二:离散二维傅立叶变换(Discrete Fourier Transformation)
  • 恢复谷歌翻译的究极方法
  • string函数以及string常用接口
  • 分享一篇由C语言实现《数据结构》无头无循环单链表