IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> [Java 并发] Synchronized 不是可重入锁吗?能不能直观展示下? -> 正文阅读

[Java知识库][Java 并发] Synchronized 不是可重入锁吗?能不能直观展示下?

作者:token keyword

关于 Synchronized 关键字,这篇文章写的是非常清楚了: [Java 并发]深入浅出 synchronized 与锁
Synchronized 是可重入锁,今天这篇文章就通过代码直观展示下它的可重入特性

在展示之前,我们再来强调一下,什么是可重入: 可重入就是在使用 Synchronized 时,当一个线程得到一个对象锁之后,再次请求这个对象锁时是可以再次得到该对象的锁的
那么在一个 Synchronized 方法/块 的内部调用这个类的其他 Synchronized 方法/块 时,是可以得到锁的

用代码直观展示一下:

/**
 * @introduce: 验证 synchronized 是可重入锁
 * @author: zll
 * @DATE: 2022-3-20 17:28:34
 **/
public class SynchronizedService {
    synchronized public void serviceOne(){
        System.out.println("service one");
        serviceTwo();
    }
    synchronized public void serviceTwo(){
        System.out.println("service two");
        serviceThree();
    }
    synchronized public void serviceThree(){
        System.out.println("service three");
    }
}

/**
 * @introduce: 验证 synchronized 是可重入锁
 * @author: zll
 * @DATE: 2022-3-20 17:28:34
 **/
public class ThreadRun extends Thread {
    @Override
    public void run(){
        SynchronizedService synchronizedService = new SynchronizedService();
        synchronizedService.serviceOne();
    }
}

/**
 * @introduce: 验证 synchronized 是可重入锁
 * @author: zll
 * @DATE: 2022-3-20 17:28:34
 **/
public class Run {
    public static void main(String[] args) {
        ThreadRun thread = new ThreadRun();
        thread.start();
    }
}

SynchronizedService 这个类中, 方法 serviceOne 调用了同样被 synchronized 修饰的 serviceTwo ,方法 serviceTwo 也是调用了同样被 synchronized 修饰的 serviceThree 方法
serviceOne 在运行时就获得了 SynchronizedService 对象的锁, 而在 serviceOne 内部,则调用了被 synchronized 修饰 serviceTwo , 如果 synchronized 不是可重入锁的话,此时方法 serviceTwo 也会去获取 SynchronizedService 对象的锁,但是 SynchronizedService 这个锁在被 serviceOne 占用着,也就是: 如果 synchronized 不是可重入锁的话,就会造成死锁
我们看下程序运行的结果
在这里插入图片描述

方法 serviceOne , serviceTwo , serviceThree 里的内容都打印了出来,说明没有造成死锁
也就是: synchronized 是可重入锁

扩展: synchronized 也支持父子类继承

如果父子类都是使用 synchronized 修饰的,那么它也是支持父子类继承的
来看个具体的例子:

/**
 * @introduce: 验证 synchronized 支持父子类继承
 * @author: zll
 * @DATE: 2022-3-20 17:59:29
 **/
public class MainService {
    public int i = 10;
    synchronized public void operateMainMethod(){
        try {
            i --;
            System.out.println("main service print i = " + i);
            Thread.sleep(100);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

/**
 * @introduce: 验证 synchronized 支持父子类继承
 * @author: zll
 * @DATE: 2022-3-20 17:59:44
 **/
public class SubService extends MainService{
    synchronized public void operateSubMethod(){
        try {
            while ( i > 0){
                i --;
                System.out.println("sub service print i = " + i);
                Thread.sleep(100);
                this.operateMainMethod();
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

/**
 * @introduce: 验证 synchronized 支持父子类继承
 * @author: zll
 * @DATE: 2022-3-20 17:59:52
 **/
public class ThreadService extends Thread {
    @Override
    public void run(){
        SubService subService = new SubService();
        subService.operateSubMethod();
    }
}

/**
 * @introduce: 验证 synchronized 支持父子类继承
 * @author: zll
 * @DATE: 2022-3-20 18:00:00
 **/
public class TestInherit {
    public static void main(String[] args) {
        ThreadService threadService = new ThreadService();
        threadService.run();
    }
}

同样的道理我在这里就不重复说了,直接看程序运行结果:
在这里插入图片描述
可以很清楚的看到, synchronized 是支持父子类继承的~

参考:

  • Java 多线程编程核心技术

以上,
感谢您的阅读~

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:35:37  更:2022-03-21 20:39:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:12:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码