饿汉式改良——懒汉式单例(线程安全效率低,推荐方法二)
package pojo;
/**
* 懒汉式线程安全写法 : 延迟加载,即当需要用到此单一实例的时候,才去初始化此单一实例。(经典写法去掉线程安全限制)
*
* 要点 : 1.属性和构造方法私有化 2.属性用static和volatile修饰 3.获取方法双重检查锁
*
* 线程安全 , 效率较低
* @author exit
*
*/
public class SingleTon {
/**
* 用volatile 修饰 稍弱的同步机制 用来确保将变量的更新操作通知到其他线程。
* 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。
* volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
*/
private static volatile SingleTon instance;
// 私有化构造
private SingleTon() {
}
// 静态方法,向整个应用提供单例获取方式
// 双重检查锁
public static SingleTon getInstance() {
if (instance == null) {
synchronized (SingleTon.class) {
if (instance == null) {
instance = new SingleTon();
}
}
instance = new SingleTon();
}
return instance;
}
}
改进懒汉式单例模式 ——现在最完整的单例写法
package pojo;
/**
* 改进试懒汉单例模式 , 除了effctive java中阐述的枚举单例实现,这种方法是目前最好的实现方式
*
* 线程安全、效率高
*
* @author exit
*
*/
public class SingleTon {
/**
* 利用静态内部类特性实现外部类的单例
* 其主要原理为:Java中静态内部类可以访问其外部类的成员属性和方法,
* 同时,静态内部类只有当被调用的时候才开始首次被加载,利用此特性,可以实现懒汉式,在静态内部类中静态初始化外部类的单一实例即可。
*
* @author exit
*
*/
private static class SingleTonBuilder {
private static SingleTon singleTon = new SingleTon();
}
// 私有化构造
private SingleTon() {
}
public SingleTon getInstance() {
return SingleTonBuilder.singleTon;
}
}
详细解释请移步: https://www.cnblogs.com/zhengyu940115/p/6652465.html