- 一、懒汉式多线程示例代码
- 二、懒汉式(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个线程分别创建了同一个对象
1、debug模式启动测试类,切换到thread-0线程。如下图: 2、步入到线程类,此时thread-0还没有创建对象,如下图:
3、切换回thread-1线程,步入到线程类,如下图:
4、此时thread-1已经创建了对象,直接返回结果输出,如下图:
5、可以看到thread-1线程创建的对象在控制台已经输出,如下图:
6、再切换到thread-0线程,创建对象后输出结果,如下图:
7、可以看到2个线程所创建的对象不是同一对象,如下图:
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关键字后,多个线程会创建同一对象,解决了多个线程创建不同对象的问题。