码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • IDEA在多线程环境下断点调试-验证synchronized监视锁的运行状态


    场景

    Java中数据同步-synchronized关键字与Mointor的使用:

    Java中数据同步-synchronized关键字与Mointor的使用_霸道流氓气质的博客-CSDN博客

    上面简单介绍synchronized的使用,如果在IDEA中怎样对多线程的程序进行调试,

    比如分别对单个线程进行断点调试,当第一个线程执行到synchronized时验证是否会

    上锁,然后再调试另一个线程,是否还能再进入。

    注:

    博客:
    霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    1、首先实现一个懒汉式单例模式的示例类

    1. package com.ruoyi.demo.designPattern.lazySimpleSingleton;
    2. /**
    3.  * 懒汉式单例模式:被外部类调用时内部类才会加载
    4.  */
    5. public class LazySimpleSingleton {
    6.     private static LazySimpleSingleton lazySimpleSingleton = null;
    7.     private LazySimpleSingleton(){}
    8.     //静态块,公共内存区域
    9.     public  static LazySimpleSingleton getInstance(){
    10.         if(lazySimpleSingleton == null){
    11.             synchronized(LazySimpleSingleton.class){
    12.                 if(lazySimpleSingleton == null){
    13.                     lazySimpleSingleton = new LazySimpleSingleton();
    14.                 }
    15.             }
    16.         }
    17.         return lazySimpleSingleton;
    18.     }
    19. }

    2、然后写一个线程类ExecutorThread

    1. package com.ruoyi.demo.designPattern.lazySimpleSingleton;
    2. public class ExecutorThread implements Runnable{
    3.     @Override
    4.     public void run() {
    5.         LazySimpleSingleton simpleSingleton = LazySimpleSingleton.getInstance();
    6.         System.out.println(Thread.currentThread().getName()+":"+simpleSingleton);
    7.     }
    8. }

    3、客户端测试代码如下

    1. package com.ruoyi.demo.designPattern.lazySimpleSingleton;
    2. public class LazySimpleSingletonTest {
    3.     public static void main(String[] args) {
    4.         Thread t1 = new Thread(new ExecutorThread());
    5.         Thread t2 = new Thread(new ExecutorThread());
    6.         t1.start();
    7.         t2.start();
    8.         System.out.println("结束");
    9.     }
    10. }

    4、这种情况如何在IDEA中进行断点调试,并验证两个线程在同时进入synchnorized时的表现

    用线程模式调试

    先给ExecutorThread类打上断点,鼠标右键单击断点,切换为Thread模式

    然后给LazySimpleSingleton类同样打上断点并设置为Thread,这里在进入getInstacne方法和进入synchronized时分别打上断点

     

    给客户端测试代码同样也打上断点,同样改为Thread模式

     

    开始debug后,可以在debug控制台切换Thread并分别进行调试

     

    5、先选中线程0,使其进入到synchronized中,此时会进行上锁,然后再切换到线程1,此时1再执行到

    synchronized时就会变成MONITOR状态,出现堵塞。直到进程0执行完,进程1才恢复到RUNNING状态。

     

  • 相关阅读:
    【运维项目经历|040】高可用Web服务平台:LVS+Apache集群+NFS共享存储系统
    强化学习环境 - robogym - 学习 - 1
    聊聊FLINK-25631贡献
    Windows 系统服务器部署jar包时,推荐使用winsw,将jar包注册成服务,并设置开机启动。
    Vue3.0 中的响应式对象
    什么是云原生的应用?
    千万级用户的大型网站,如何进行服务器压力预估?
    [附源码]计算机毕业设计JAVA高校新生报到管理系统
    为了大厂得码住学起来~Java架构师进阶之路:Java核心框架指导
    rknn3588 rstp yolov5
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127551825
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号