Java-单例设计模式
单例模式
单线程
饿汉式:
public Class Singleton{
//类被加载的时候就实例化一个对象
private static Singleton singleton1 = new Singleton();
//私有的构造方法
private Singleton(){}
//以自己实例为返回值的静态的公有方法
public static Singleton getSingleton(){
return singleton1;
}
}
懒汉式:
public Class Singleton{
private static Singleton singleton2;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton2 == null){
singleton2 = new Singleton();
}
return singleton2;
}
}
多线程
饿汉式天生线程安全
懒汉式保证线程安全的四种方法:
-
synchronized方法
public Class Singleton{ private static Singleton singleton2; private Singleton(){} public static synchronized Singleton getSingleton(){ if(singleton2 == null){ singleton2 = new Singleton(); } return singleton2; } } -
synchronized代码块
public Class Singleton{ private static Singleton singleton2; private Singleton(){} public static Singleton getSingleton(){ synchronized(Singleton.class){ if(singleton2 == null){ singleton2 = new Singleton(); } } return singleton2; } } -
内部类
public Class Singleton{ private Singleton(){} private static Singleton Holder(){ private static singleton2 = new Singleton() ; } public static Singleton getSingleton(){ return Holder.singleton2; } } -
双重延迟检测
public Class Singleton{ private static volatile Singleton singleton2; private Singleton(){} public static Singleton getSingleton(){ if(singleton2 == null){ //只在第一次new实例的时候同步 synchronized(Singleton.class){ singleton2 = new Singleton(); } } return singleton2; } } -
ThreadLocal
public Class Singleton{ private static Singleton singleton2; private static ThreadLocal<Singleton> threadLocal = new ThreadLocal<>(); private Singleton(){} private static Singleton CreateSingleton(){ if (singleton4 == null) { // 第二次检查:该单例是否被创建 singleton4 = new Singleton4(); } threadLocal.set(singleton4); } public static Singleton getSingleton(){ if (threadLocal.get() == null) { // 第一次检查:该线程是否第一次访问 createSingleton(); } return singleton2; } }

浙公网安备 33010602011771号