zoukankan      html  css  js  c++  java
  • 单例模式

    一。特点:

     1.构造器私有化
    2.自行创建,并用静态变量保存
    3.向外提供这个实例
    4.强调这是一个单例,用final修饰

    一。饿汉式:在类初始化时直接创建实例对象(线程安全),不管你是否需要这个对象

      1.直接实例化饿汉式(简洁直观)

    1 public class Singleton1 {
    2     public static final Singleton1 INSTANCE = new Singleton1();
    3     private Singleton1() { }
    4 
    5     public void test01(){}
    6 }

      2.枚举(最简洁)

    public enum Singleton2 {
        INSTANCE
    }

      3.使用静态代码块(适合复杂实例化)

    single.propertis:
    info=zhengcj
     1 public class Singleton3 {
     2     public static final Singleton3 INSTANCE;
     3     private String info;
     4     static {
     5         try {
     6             Properties pro = new Properties();
     7             pro.load(Singleton3.class.getClassLoader().getResourceAsStream("single.propertis"));
     8             INSTANCE = new Singleton3(pro.getProperty("info"));
     9         } catch (IOException e) {
    10             throw new RuntimeException(e);
    11         }
    12     }
    13     private Singleton3(String info) {
    14         this.info = info;
    15     }
    16     public String getInfo() {
    17         return info;
    18     }
    19     public void setInfo(String info) {
    20         this.info = info;
    21     }
    22 }

    二。懒汉式:延迟创建对象

      1.线程不安全(适合单线程)

     1 public class Singleton4 {
     2     private static Singleton4 instance;
     3     private Singleton4() { }
     4     public static Singleton4 getInstance() {
     5         if (instance == null) {
     6             return instance = new Singleton4();
     7         }
     8         return instance;
     9     }
    10 }

      2.线程安全(适合多线程)

     1 public class Singleton4 {
     2     private static Singleton4 instance;
     3     private Singleton4() { }
     4     public static Singleton4 getInstance() throws InterruptedException {
     5         if(instance == null){
     6             synchronized (Singleton4.class){
     7                 if (instance == null) {
     8                     TimeUnit.SECONDS.sleep(1);
     9                     return instance = new Singleton4();
    10                 }
    11             }
    12         }
    13         return instance;
    14     }
    15 }

      3.静态内部类形式(适合多线程)

      * 在内部类被加载和初始化时,才创建INSTANCE实例对象
      * 静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的。
      * 因为是在内部类加载和初始化时,创建的,因此是线程安全的
    1 public class Singleton5 {
    2     private Singleton5 () { }
    3     private static class Inner {
    4         private static final Singleton5 INSTANCE = new Singleton5();
    5     }
    6     public static Singleton5 getInstance(){
    7         return Inner.INSTANCE;
    8     }
    9 }
  • 相关阅读:
    FreeSql (二十)多表查询 WhereCascade
    FreeSql (十九)多表查询
    FreeSql (十八)导航属性
    FreeSql (十七)联表查询
    FreeSql (十六)分页查询
    C#实现.Net对邮件进行DKIM签名和验证,支持附件,发送邮件签名后直接投递到对方服务器(无需己方邮件服务器)
    C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出
    Zookeeper Windows版的服务安装和管理工具
    Nginx Windows版的服务安装和管理工具
    1kb的前端HTML模板解析引擎,不限于嵌套、循环、函数你能想到的解析方式
  • 原文地址:https://www.cnblogs.com/zcjyzh/p/14312815.html
Copyright © 2011-2022 走看看