您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java设计模式——单例模式之懒汉式及多线程debug

小志的博客 发布时间:2020-05-20 09:12:25 ,浏览量:0

目录
    • 一、懒汉式多线程示例代码
    • 二、懒汉式(2个线程创建同一对象的debug情况)
    • 三、懒汉式(2个线程创建不同对象的debug情况)
    • 四、解决懒汉式中(2个线程创建不同对象debug)的问题。

一、懒汉式多线程示例代码

1、定义一个懒汉式类的单例类

package com.rf.designPatterns.singleton;
/**
 * @description: 懒汉式:注重延迟加载,只有使用时才创建对象
 * @author: xiaozhi
 * @create: 2020-05-19 13:59
 */
public class LazySingleton {
    //声明一个需要被单例的对象,初始化时没有被创建所以设置null
    private static LazySingleton lazySingleton=null;
    //私有的构造器,不被外部所访问
    private LazySingleton(){

    }
    //提供一个外部获取LazySingleton对象的静态方法
    public static LazySingleton getInstance(){
        if(lazySingleton==null){
            lazySingleton=new LazySingleton();
        }
        return lazySingleton;
    }
}

2、定义一个线程类,调用单例中的getInstance方法

package com.rf.designPatterns.singleton;
/**
 * @description: 线程类
 * @author: xiaozhi
 * @create: 2020-05-19 14:12
 */
public class MyThread implements Runnable{
    @Override
    public void run() {
        LazySingleton lazySingleton = LazySingleton.getInstance();
        System.out.println(Thread.currentThread().getName()+": "+lazySingleton);
    }
}

3、定义一个测试类

package com.rf.designPatterns.singleton;
/**
 * @description: 测试类
 * @author: xiaozhi
 * @create: 2020-05-19 14:06
 */
public class Test {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyThread());
        Thread thread2 = new Thread(new MyThread());
        thread1.start();
        thread2.start();
        System.out.println("end");
    }
}
二、懒汉式(2个线程创建同一对象的debug情况)

1、分别在测试类、线程类、单例类中打断点,右键Suspend属性中选择【Thread】。如下图: 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述 2、debug模式启动测试类,有主线程切换到thread-0线程,步入到线程类中,如下图: 在这里插入图片描述 3、此时thread-0还没有创建对象。如下图: 在这里插入图片描述 4、切换到thread-1线程,步入到线程类。如下图: 在这里插入图片描述 5、此时thread-1线程也没有创建对象,如下图: 在这里插入图片描述 6、再切换回thread-0线程,步入到创建对象之后的断点,此时thread-0已经创建了一个536结尾的对象。 在这里插入图片描述 7、再切回thread-1线程,可以看到thread-0创建的一个536结尾的对象。 在这里插入图片描述

8、再thread-1线程中,步入到创建对象之后的断点,此时thread-1已经创建了一个537结尾的对象.如果切回thread–0线程中,会看到对象会被覆盖。 在这里插入图片描述 9、此时,2个线程分别创建了同一个对象 在这里插入图片描述

三、懒汉式(2个线程创建不同对象的debug情况)

1、debug模式启动测试类,切换到thread-0线程。如下图: 在这里插入图片描述 2、步入到线程类,此时thread-0还没有创建对象,如下图: 在这里插入图片描述 3、切换回thread-1线程,步入到线程类,如下图: 在这里插入图片描述 4、此时thread-1已经创建了对象,直接返回结果输出,如下图: 在这里插入图片描述 5、可以看到thread-1线程创建的对象在控制台已经输出,如下图: 在这里插入图片描述 6、再切换到thread-0线程,创建对象后输出结果,如下图: 在这里插入图片描述 7、可以看到2个线程所创建的对象不是同一对象,如下图: 在这里插入图片描述

四、解决懒汉式中(2个线程创建不同对象debug)的问题。

1、在单例的静态方法中添加synchronized关键字,如下2图效果是相同的,都是锁住LazySingleton类。 在这里插入图片描述在这里插入图片描述

2、debug模式启动,切换到thread-0线程上,进入getInstance方法,此时对象还没有创建,如下图: 在这里插入图片描述 3、再切换到thread-1线程上,看到状态为MONITOR,线程thread-1被thread-0所阻塞,如下图: 在这里插入图片描述 4、在切换回thread-0,直接跳过断点,返回创建的对象,并在控制台输出结果,如下图: 在这里插入图片描述 在这里插入图片描述 5、在切回thread-1,如下图操作: 在这里插入图片描述 6、返回的还是thread-0创建的对象,如下图: 在这里插入图片描述在这里插入图片描述7、多个线程创建不同对象的问题已解决。

此时在getInstance方法中添加synchronized关键字后,多个线程会创建同一对象,解决了多个线程创建不同对象的问题。

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0452s