首页 > 其他分享 >IDEA在多线程环境下断点调试-验证synchronized监视锁的运行状态

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

时间:2022-10-27 14:34:03浏览次数:82  
标签:synchronized Thread lazySimpleSingleton 线程 LazySimpleSingleton 多线程 断点

场景

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

 

标签:synchronized,Thread,lazySimpleSingleton,线程,LazySimpleSingleton,多线程,断点
From: https://www.cnblogs.com/badaoliumangqizhi/p/16832135.html

相关文章

  • Java多线程(4):ThreadLocal
    您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~​为了提高CPU的利用率,工程师们创造了多线程。但是线程们说:要有光!(为了减少线程创建(T1启动)和销毁(T3切换)的时间),于是工程师们......
  • csharp-webuploader+csharp如何实现分片+断点续传
    ​文件夹数据库处理逻辑public class DbFolder{    JSONObjectroot;       public DbFolder()    {        this.root= new JSONOb......
  • c#-webuploader+c#如何实现分片+断点续传
    ​以ASP.NETCoreWebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API,包括文件的上传和下载。 准备文件上传的API #region 文件上传 ......
  • java多线程编程详细入门教程
    ##1、概念?线程是jvm调度的最小单元,也叫做轻量级进程,进程是由线程组成,线程拥有私有的程序技术器以及栈,并且能够访问堆中的共享资源。这里提出一个问题,为什么要用多......
  • Java多线程(4):ThreadLocal
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 为了提高CPU的利用率,工程师们创造了多线程。但是线程们说:要有光!(为了减少线程创建(T1启动)和销毁(T3切换)的时间),于是工程师们......
  • 第二十章 多线程
    多线程本章将介绍Python中的多线程编程。多线程一直是Python学习中的重点和难点,需要反复练习和研究。1.线程和进程在学习多线程的使用之前,需要先了解线程、进程的概念......
  • 程序、进程和线程 Java多线程的状态【杭州多测师】【杭州多测师_王sir】
    CPU是以时间片的方式为进程分配CUP处理时间的,如果当一个进程同时要完成几件事的时候,如当从网上下载文件的时候,需要一边下载一边显示进度而且还要一边保存,如果按照单线程的思......
  • Java创建多线程的3种方式和Java当中的线程池【杭州多测师】【杭州多测师_王sir】
    /***创建线程的3种方式*1.继承Thread类*2.实现Runnable接口*3.实现Callable接口*4.一个进程可以有多个线程、一个线程对应一个进程*5.防止多线程数据共享和超卖......
  • Java多线程(3):ThreadPool(下)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 除了可以通过ThreadPoolExecutor自定义线程池外,同StreamAPI中的Collectors一样,多线程里的Executors类也提供了一组相关......
  • 多线程应用——双色球
    通过多线程实现双色球选号,要求:1、红球从01到33不能有重复;2、蓝球从1到16效果如下:    难点: 1、多线程实现 2、跨线程修改UI 3、线程安全(红球不能有重......