标签:bsp date 获取 cto 速度慢 syn jdk color thread
饿汉式单例模式:HurrySingleton.java
1 /** 2 * className SignalDemo 3 * 饿汉模式 4 * @author JAVADaKUn 5 * @date 2020/8/27 6 * @version:1.0 7 * @since:jdk:1.8 8 */ 9 @Getter 10 @Setter 11 @AllArgsConstructor 12 public class SignalDemo1 { 13 private String name; 14 private Integer id; 15 //在类加载的时候就完成了初始化,加载速度慢,获取对象速度快 16 private static SignalDemo1 signalDemo = new SignalDemo1(); 17 18 //构造私有 19 private SignalDemo1(){ 20 21 } 22 23 24 //方法公开,因为在类加载的时候就已经初始化,所有不加同步也不会出现线程问题 25 public static SignalDemo1 getInstance(){ 26 return signalDemo; 27 } 28 }
懒汉式单例模式:LazySignleton.java
1 /** 2 * className SignalDemo2 3 * 4 * @author JAVADaKun 5 * @date 2020/8/27 6 * @version:1.0 7 * @since:jdk:1.8 8 */ 9 @Getter 10 @Setter 11 @AllArgsConstructor 12 public class SignalDemo2 { 13 private String name; 14 private Integer id; 15 //在类加载的时候,不创建实例,因此类加载速度较快,获取对象速度较慢 16 private static SignalDemo2 signalDemo = null; 17 18 //构造私有 19 private SignalDemo2(){ 20 21 } 22 23 //需要加上同步锁,以保证线程安全,因为类变量在加载的时候,没有初始化 24 public synchronized static SignalDemo2 getInstance(){ 25 if(signalDemo==null){ 26 signalDemo=new SignalDemo2(); 27 } 28 return signalDemo; 29 } 30 }
输出比较:
1 public class SignalTest { 2 public static void main(String[] args) { 3 4 System.out.println("1 "+ SignalDemo1.getInstance()); 5 //1 signal.SignalDemo1@1540e19d 6 7 new Thread(()->{ 8 System.out.println("2 "+ SignalDemo1.getInstance()); 9 }).start(); 10 //2 signal.SignalDemo1@1540e19d 11 12 System.out.println("3 "+SignalDemo2.getInstance()); 13 //3 signal.SignalDemo2@214c265e 14 15 new Thread(()->{ 16 System.out.println("4 "+SignalDemo2.getInstance()); 17 }).start(); 18 //4 signal.SignalDemo2@214c265e 19 20 } 21 }
总结:
相同点:
一、二者需要保证构造私有化,并且需要提供一个公开静态方法。
二、必须自己创建实例
不同点:
一、饿汉模式不论外界是否调用了获取实例的方法,实例都已经初始化,调用方法,就是直接获取对象。
二、懒汉模式是在外界调用获取实例方法的时候,对实例进行初始化,并返回实例对象。
三、二者的获取实例方法有所不同,虽然都需要加上 public 和 static关键字,不过懒汉模式的方法还需要加上同步锁,以保证线程安全,
饿汉模式则不需要
标签:bsp date 获取 cto 速度慢 syn jdk color thread
原文地址:https://www.cnblogs.com/wyk96/p/13574256.html