java 单例模式:饿汉式与懒汉式

2021-03-31 00:28

阅读:516

标签: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关键字,不过懒汉模式的方法还需要加上同步锁,以保证线程安全,

饿汉模式则不需要

 

java 单例模式:饿汉式与懒汉式

标签:bsp   date   获取   cto   速度慢   syn   jdk   color   thread   

原文地址:https://www.cnblogs.com/wyk96/p/13574256.html


评论


亲,登录后才可以留言!