手写单例模式
/**
* 单例模式
* @author gy2018
*
*/
public class SingletonDemo {
/**
* 所谓的单例模式,就是整个程序有且仅有一个实例。
* 该类负责创建自己的对象 并确保只有一个对象被创建。
* 在java中,一般常用在工具类的实现或创建对象 需要消耗资源
*
* 特点:
* 类构造器私有
* 持有自己类型的属性
* 对外提供获取实例的静态方法
*/
/**
* 饿汉模式
* 线程安全,比较常用,但是一开始就初始化,容易产生垃圾
*/
// //创建私有静态的对象
// private static SingletonDemo singletonDemo = new SingletonDemo();
// //私有构造器
// private SingletonDemo(){};
// //提供一个共有可调用的方法获取实例
// public static SingletonDemo getSingletonDemo(){
// return singletonDemo;
// }
/**
* 懒汉模式
* 线程不安全,延迟初始化,严格意义上来讲不是单例模式
*/
// private static SingletonDemo instance;
// private SingletonDemo(){};
// public static SingletonDemo getInstance(){
// if(instance == null){
// instance = new SingletonDemo();
// }
// return instance;
// }
/**
* 双重锁的单例模式,安全且在多线程情况下能保持高性能
* 进行了两次判断,避免了不要的实例,第二次是为了同步,避免多线程问题。
* 由于instance = new SingletonDemo()对象的创建在JVM中可能会进行重排序,
* 在多线程访问下存在风险,使用volatile修饰instance实例变量有效,解决该问题。
*/
private static SingletonDemo instance;
private SingletonDemo(){};
public static SingletonDemo getInstance(){
if(instance == null){
synchronized (SingletonDemo.class) {
if(instance == null){
instance = new SingletonDemo();
}
}
}
return instance;
}
}