懒汉式
/**
* 懒汉式单例模式概念:
* 不主动创建,在没有的情况下才会创建唯一实例,并且对象私有,构造私有
*/
public class SingletonLan {
/**
* 私有的对象
* 加volatile 提供可见性
* 所谓可见性,我的理解就是多个线程操作同一对象时,一旦对象发生改变,其余线程立马可见。
* 并发情况下 ,此时A线程进入了双重检查锁去实例化对象
* 线程B在锁外等候,线程A实例化完对象后往下执行,但是此时线程B是不知道线程A已经
* 实例化出对象了,所有线程B会接着进同步锁去实例化,那就违背单例模式,所有需要
* 加volatile关键字
*/
private static volatile SingletonLan singletonLan = null;
/**
* 私有构造 防止被new 对象
*/
private SingletonLan() {}
/**
* 对外暴露的获取实例
* @return
*/
public static SingletonLan getInstance(){
// 双重检查锁
if(singletonLan==null){
//确认当前实例为空的情况下 进入锁
synchronized (singletonLan.getClass()){
/**
* 再在锁中确认此时只有一个线程进来 并且该线程实例为null 创建对象
* (如果没有加锁 有多个线程同时进入这个if内去实例化对象 可能造成多个对象的生成 不符合单例模式)
*/
if (singletonLan == null){
singletonLan = new SingletonLan();
}
}
}
return singletonLan;
}
}
饿汉式
/**
* 饿汉式单例模式概念
* 顾名思义,饿汉式比较着急,所有直接就会给出唯一实例,我称之为 白给
* 注意 对象以及构造也都是私有
*/
public class SingletonHungry {
/**
* 私有且静态的对象
* 类实例化时创建 线程安全
*/
private final static SingletonHungry singleton = new SingletonHungry();
/**
* 私有构造 防止外部 new
*/
private SingletonHungry(){}
/**
* 对外暴露的获取实例
* @return
*/
public static SingletonHungry getInstance(){
return singleton;
}
}