单例模式(规整版)
单例模式写法有很多 主要考虑到 以下三方面 1.线程安全 2.不会因为序列化而产生新实例 3.防止反射攻击
之前一直在用饿汉模式,个人推荐枚举,饿汉次之。
单例模式
1、懒汉模式 线程不安全
public class SingleTon {
private static SingleTon instance;
private SingleTon() {
}
public static SingleTon getIntence() {
if (instance == null) {
instance = new SingleTon();
}
return instance;
}
}
// 懒汉模式 线程安全
public class SingleTon {
private static SingleTon instance;
private SingleTon() {
}
public static synchronized SingleTon getIntence() {
if (instance == null) {
instance = new SingleTon();
}
return instance;
}
}
2、 饿汉模式 始终有一个实例在内存中
// 饿汉模式 一上来就加载 避免多线程的同步问题 类装载的时候就初始化
public class SingleTon {
public static SingleTon instance=new SingleTon();
private SingleTon(){};
public static SingleTon getInstance(){
return instance;
}
}
3、静态内部类 延时加载调用时候才有实例在内存中
// 静态内部类 保证只有一个线程 类装载的时候不一定初始化
public class SingleTon {
private static class MySington{
private static final SingleTon myInstance=new SingleTon();
}
private SingleTon(){};
private static SingleTon getinstance(){
return MySington.myInstance;
}
}
4、枚举 自由序列化 保证单个实例 线程安全 方便使用
public enum EnumSingleTon {
INSTANCE;
private EnumSingleTon() {
}
public void sysEnum() {
System.out.println("来自枚举");
}
}
5、 双层检测锁机制 加强版懒汉模式
public class SingleTon {
public static SingleTon getInstance(){
if(instance==null){ // 单层检测
synchronized (SingleTon.class) { // 加锁
if(instance==null){ // 再次检测
instance=new SingleTon();
}
}
}
return instance;
}
}
浙公网安备 33010602011771号