zoukankan      html  css  js  c++  java
  • java 单例模式:饿汉式与懒汉式

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

    饿汉模式则不需要

    怕什么真理无穷,进一寸有一寸的欢喜!
  • 相关阅读:
    Linux:修改Shell命令提示符及颜色
    Linux:cut命令详解
    pageadmin去掉xxx
    高手详解SQL性能优化十条经验
    一道简单递归题
    list<?>转换成 对应的 class
    《一道笔试题》找出最连续数字的最大长度
    poi 获取excel数据 导入数据库
    有一个5ml 的瓶子 和3ml 的瓶子 和 很多水 现在 要取出4ml的水 请写出编程 多种解法
    假设字符串类似这样的aba和aab,abc和bca就相等,现在随便给你二组字符串,请编程比较他们看是否相等
  • 原文地址:https://www.cnblogs.com/wyk96/p/13574256.html
Copyright © 2011-2022 走看看