22、多线程debug案例(非安全单例模式)

多线程调试

案例:单例模式(非线程安全)使用此案例来模拟多线程调试
1、新建单例类

public class Singtons {

    private static Singtons singtons;

    private Singtons(){
    }

    public static Singtons getInstance(){

        if(singtons==null){
//假设两个线程调用这个方法,当一个线程进入if函数内,但是未进行实例化,而另一个线程也进入了函数方法,这样就会New出两个不同的对象。所以此种单例模式是不安全的;
            singtons=new Singtons();
        }
        return singtons;
    }
}

2、创建线程类

public class ThreadDemo implements Runnable {
    public void run() {
        Singtons singtons=Singtons.getInstance();
        System.out.println("线程:"+Thread.currentThread().getName()+" 实例:"+singtons);
    }
}

3、创建测试类

public class SintonTest3 {

    public static void main(String[] args) {
        Thread t1=new Thread(new ThreadDemo());
        Thread t2=new Thread(new ThreadDemo());
        t1.start();
        t2.start();
        System.out.println("执行结束");
    }
}

4、操作步骤
4.1、设置测试类debug断点调试方式为线程方式
在这里插入图片描述
4.2、设置单例类中的断点调试方式为线程方式
在这里插入图片描述
4.3、debug启动测试类
在这里插入图片描述
可以看到调试窗口有3个线程,主线程和线程1以及线程2
在这里插入图片描述
4.4、单线程调试
可以选择线程1 以及线程2进行单独的调试
下面先以线程1为例,点击下一步
在这里插入图片描述
进入单例类断点
在这里插入图片描述
此时singtons并没有new对象,所以依然为null;

接下来点击线程0
在这里插入图片描述
点击下一步,也进入单例类断点
在这里插入图片描述
继续前进一步
在这里插入图片描述
可以看到new的实例为556
点击执行完此线程,可以看到窗口打印结果
在这里插入图片描述
切换为线程一,点击执行完线程,可以看到窗口打印结果
在这里插入图片描述
可以看到,在人工的干预下,产生了两个不同的实例对象,验证了线程非安全的场景。
5、输出同一个对象情况
当单个线程执行到new对象时,没有ruturn并且等待另一个线程new对象,可以看到之前的线程的对象已经变成另一个线程new的对象的值了,如下图所示:
Thread-0: 对象为@551
在这里插入图片描述
Thread-1: 对象为@552
在这里插入图片描述
在切换回Thread-0: 可以看到对象被覆盖了, 对象为@552
在这里插入图片描述
执行完两个线程查看输出结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值