• IDEA在多线程环境下断点调试验证synchronized监视锁的运行状态


    场景

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

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126743812

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

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

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

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

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

    package com.ruoyi.demo.designPattern.lazySimpleSingleton;
    
    /**
     * 懒汉式单例模式:被外部类调用时内部类才会加载
     */
    public class LazySimpleSingleton {
    
        private static LazySimpleSingleton lazySimpleSingleton = null;
    
        private LazySimpleSingleton(){}
        //静态块,公共内存区域
        public  static LazySimpleSingleton getInstance(){
            if(lazySimpleSingleton == null){
                synchronized(LazySimpleSingleton.class){
                    if(lazySimpleSingleton == null){
                        lazySimpleSingleton = new LazySimpleSingleton();
                    }
                }
            }
            return lazySimpleSingleton;
        }
    }

    2、然后写一个线程类ExecutorThread

    package com.ruoyi.demo.designPattern.lazySimpleSingleton;
    
    public class ExecutorThread implements Runnable{
    
        @Override
        public void run() {
            LazySimpleSingleton simpleSingleton = LazySimpleSingleton.getInstance();
            System.out.println(Thread.currentThread().getName()+""+simpleSingleton);
        }
    }

    3、客户端测试代码如下

    package com.ruoyi.demo.designPattern.lazySimpleSingleton;
    
    public class LazySimpleSingletonTest {
        public static void main(String[] args) {
            Thread t1 = new Thread(new ExecutorThread());
            Thread t2 = new Thread(new ExecutorThread());
            t1.start();
            t2.start();
            System.out.println("结束");
        }
    }

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

    用线程模式调试

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

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

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

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

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

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

  • 相关阅读:
    第九章:Elasticsearch集群优化及相关节点配置说明
    Linux115条常用命令
    第一章:引擎介绍
    第七章:JAVA引用ESWCF及部分方法说明
    第八章:SCRT搭建ES搜索引擎步骤
    第三章:ES分词简单说明
    第二章:ES索引说明
    疑难杂症:Java中Scanner连续获取int和String型发生错误.
    java实现中缀表达式转后缀表达式
    编程题:输出字符集合的所有排列组合。
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/16832135.html
Copyright © 2020-2023  润新知