Effective3. 用私有构造器或者枚举类型强化Single

2020-06-23  本文已影响0人  小蜜蜂_Jade

什么是单例类

Singleton是指仅被实例化一次的类。通常被用来代表一个无状态的对象,如函数,或者唯一的系统组件。

实现

  1. 静态工厂方法
package com.cyf.SomeIpt;

/**
 * @Auther: ChenYF
 * @Date: 2019/8/23 09:12
 * @Description:双重检验锁 为什么要加 volatile: 这一行代码 singleton = new Singleton(); 可分解为以下三行伪代码
 * memory = allocate();   //1:分配对象的内存空间
 * ctorInstance(memory);  //2:初始化对象
 * instance = memory;     //3:设置instance指向刚分配的内存地址
 * 2和3之间,可能会被重排序,这样执行3时:注意,此时对象还没有被初始化!(所以另一个线程引用的对象有可能还没有完成初始化)
 * <p>
 * 介绍一下volatile(易变的)!
 * 主要作用:使变量在多个线程间可见(可见性);强制从公共内存中读取变量的值;
 * 与synchronized比较:
 * 1、volatile是线程同步的轻量级实现,性能优于synchronizad;
 * 2、volatile只能修饰变量,而s 可以用于修饰方法,以及代码块;
 * 3、多线程访问volatile不会发生阻塞,而s 会;
 * 4、volatile 能保证数据的可见性,但不会保证原子性;而s 主要解决多个线程访问资源的同步性具有可见性与互斥性。
 * <p>
 * i++ 分解为 1:从内存中取出i的值、2:计算i的值、3:将i的值写到内存中
 * <p>
 * 练习次数:2 -> 10.8success 3->10.15success master
 */
public class Singleton {
    private static volatile Singleton singleton;
    private Singleton() {
    }
    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}
  1. 枚举形式
/**
 * @Auther: ChenYF
 * @Date: 2019/10/1 00:41
 * @Description:对比双重检验锁模式,枚举解决了反射攻击和序列化问题
 */
public enum singletonEnum {
    INSTANCE;
    public singletonEnum getInstance(){
        return INSTANCE;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读