• 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状态。

     

  • 相关阅读:
    filebeat(8.9.0)采集日志到logstash,由logstash发送的es
    monaco-editor 实现SQL编辑器
    sc60 硬件设计
    深度强化学习与APS的一些感想
    php7.3 centos7.9安装sqlserver扩展
    全网最详细Java-JUC
    vulnhub blogger: 1
    spring:详解控制反转IOC和AOP
    网络通信IO模型上
    Stable Diffusion原理
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127551825