IDEA环境下的多线程调试方式

IDEA环境下的多线程调试方式

本文以最简陋的单例模式为例,示例如何使用IDEA调试多线程

1.代码准备

  • 创建一个单例类
package com.lchtest.pattern.singleton.lazy;

/**
 * 单例模式最基本条件
 * 1.构造方法私有化
 * 2.提供全局访问点
 */
public class LazySimpleSingleton {

    public static LazySimpleSingleton lazy;

    private LazySimpleSingleton() {
    }

    public static LazySimpleSingleton getInstance() {
        if (null == lazy) {  //在这里加断点调试
            lazy = new LazySimpleSingleton();
        }
        return lazy;
    }
}
package com.lchtest.pattern.singleton.lazy.test;

import com.lchtest.pattern.singleton.lazy.LazySimpleSingleton;

public class ExecutorThread implements Runnable {
    public void run() {
        LazySimpleSingleton singleton = LazySimpleSingleton.getInstance();   // 在这里加上断点

        System.out.println(Thread.currentThread().getName() + "-" + singleton);
    }
}

  • 创建2个线程来获取实例
package com.lchtest.pattern.singleton.lazy.test;

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("Executor end"); //此处加断点
    }
}

2.打断点,设置断点模式

在代码中对应行打上断点:
IDEA环境下的多线程调试方式_第1张图片
IDEA环境下的多线程调试方式_第2张图片
鼠标右击选中的断点,选择Thread,然后点击done,对所有断点进行相同设置;suspend选项如果设置为all,就会出现第一个线程启动后直接阻塞。而如果suspend选项设置为Thread,那么不同的线程可以并发到这个断点。
IDEA环境下的多线程调试方式_第3张图片

3. 断点调试

启动之后,在Frames这里,切换为线程0
IDEA环境下的多线程调试方式_第4张图片
会自动进入ExecutorThread这个类并停在断点这一行:
IDEA环境下的多线程调试方式_第5张图片
F8单步调试,执行到getInstance()方法时,会自动停在if 判断这里,此时再点一下单步调试,让蓝色横条停在 lazy = new LazySimpleSingleton(); 这一行 ,(注意,不要执行new LazySimpleSingleton()代码)
IDEA环境下的多线程调试方式_第6张图片
然后切换为线程1,会自动停在断点这一行,将线程1的代码执行完,
IDEA环境下的多线程调试方式_第7张图片
然后切换为线程0,然后把线程0的代码也执行完,然后切换到控制台,可以发现,产生了两个不同的实例!
IDEA环境下的多线程调试方式_第8张图片

4.动图演示:

你可能感兴趣的:(Intellij,IDEA)