标签:安全 name vat ret 实用 sync jvm end syn
单个实例
保证程序中只有一个实例
/*
* 饿汉式
类加载到内存中,实例化一个单例,jvm保证线程安全
简单实用,推荐使用
Class.forName("")
唯一缺点: 不管用到与否,类装载时就完成实例化 (不用装载他干啥?)
*/
public class Mg01{
private static final Mg01 INSTANCE= new Mg01();
private Mg01(){}
public static Mg01 getInstance(){
return INSTANCE;
}
}
/**
lazy loading
懒汉式
不安全
*/
public class Mg03{
private static Mgr03 INSTANCE;
private Mg03(){}
public static Mr03 getInstance(){
if(INSTANCE == NULL){
INSTANCE = new Mg03();
}
return INSTANCE;
}
}
//加锁 没问题 但是颗粒度太大
public class Mg03{
private static Mgr03 INSTANCE;
private Mg03(){}
public static synchronized Mr03 getInstance(){
if(INSTANCE == NULL){
INSTANCE = new Mg03();
}
return INSTANCE;
}
}
/**
颗粒度小了 但是又出现 现场安全问题
*/
public class Mg03{
private static Mgr03 INSTANCE;
private Mg03(){}
public static Mr03 getInstance(){
if(INSTANCE == NULL){
synchronized(mg03.class){
INSTANCE = new Mg03();
}
}
return INSTANCE;
}
}
/**
双重检测 DCL 完美
*/
public class Mg03{
//volatile 加上 不然会有指令重排问题
private static volatile Mgr03 INSTANCE;
private Mg03(){}
public static Mr03 getInstance(){
if(INSTANCE == NULL){
synchronized(mg03.class){
if(INSTANCE == NULL){
INSTANCE = new Mg03();
}
}
}
return INSTANCE;
}
}
//完美 另一种 静态内部类
public class Mg04{
private Mg04(){}
private static class Mg04Holder{
private final static Mg04 instance = new Mg04();
}
public static Mg04 getInstatnce(){
return Mg04Holder.instance;
}
}
//枚举单例 最完美的
// 不仅可以解决线程同步,还可以防止反序列化
// 防止反序列化 完美的 原因是 枚举类没有构造方法
public enum Mg05{
INSTANCE;
public void m(){}
}
//语法上最完美 枚举单例
标签:安全 name vat ret 实用 sync jvm end syn
原文地址:https://www.cnblogs.com/lccsdncnblogs/p/singleton.html