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

    用于创建单一类。例如一些工具类等。

    主要有以下四种实现:

    lazy load,线程不安全

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

    lazy load,线程安全,但是每次获取需要锁,效率较差

     1 public class SafeLazySingletonWithLock {
     2 
     3     private static SafeLazySingletonWithLock instance;
     4 
     5     private SafeLazySingletonWithLock() {
     6     }
     7 
     8     public static synchronized SafeLazySingletonWithLock getInstance() {
     9         if (instance == null) {
    10             instance = new SafeLazySingletonWithLock();
    11         }
    12         return instance;
    13     }
    14 }

    线程安全

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

    双检索

     1 public class DoubleCheckedSingleton {
     2 
     3     private volatile static DoubleCheckedSingleton singleton;
     4 
     5     private DoubleCheckedSingleton() {
     6     }
     7 
     8     public static DoubleCheckedSingleton getSingleton() {
     9         if (singleton == null) {
    10             synchronized (DoubleCheckedSingleton.class) {
    11                 if (singleton == null) {
    12                     singleton = new DoubleCheckedSingleton();
    13                 }
    14             }
    15         }
    16         return singleton;
    17     }
    18 }

    推荐最后一种方式,即实现了lazy load,又是线程安全,并且只有在初次加载并发的时候需要锁,其他时候不会用到锁,效率也有保障。PS:首次并发的时候出现冲突,都运行到代码10,当一个线程成功初始化后,由于单例是volatile修饰的,其他线程可见,代码11判断后不会发生重复定义,保证线程安全。

  • 相关阅读:
    gitlab 重置密码
    _string 灵活查询
    删除前面,删除后面
    HTTPS
    PHP正则匹配价格
    PHP LUHN算法验证银行卡
    PHP 与操作判断奇偶
    PHP与Cookie
    检查字符串是否存在
    php密码正则匹配
  • 原文地址:https://www.cnblogs.com/avalon-merlin/p/10522378.html
Copyright © 2011-2022 走看看