常用的一些单例模式:
饿汉式单例
package com.example.demo.singleton;
public class HungrySingleton {
private HungrySingleton(){};
private final static HungrySingleton hungrySingleton = new HungrySingleton();
public static HungrySingleton getInstance(){
return hungrySingleton ;
}
}
懒汉式单例:
package com.example.demo.singleton;
public class LazySingleton {
private LazySingleton(){}
private static final LazySingleton lazySingleton = null ;
public static synchronized LazySingleton getInstance(){
return new LazySingleton() ;
}
}
双重检查锁式单例
package com.example.demo.singleton;
public class DoubleCheckSingleton {
private DoubleCheckSingleton(){}
private static final DoubleCheckSingleton doubleCheckSingleton = null;
public static DoubleCheckSingleton getInstance(){
if(doubleCheckSingleton == null){
synchronized (DoubleCheckSingleton.class){
if (doubleCheckSingleton == null){
return new DoubleCheckSingleton() ;
}
}
}
return doubleCheckSingleton ;
}
}
内部类式单例
package com.example.demo.singleton;
public class InnerClassSingleton {
private InnerClassSingleton(){}
private static class LazyHolder{
private static final InnerClassSingleton INNER_CLASS_SINGLETON = new InnerClassSingleton();
}
public static InnerClassSingleton getInstance(){
return LazyHolder.INNER_CLASS_SINGLETON;
}
}
枚举式单例:
package com.example.demo.singleton;
public enum EnumSingleton {
INSTANCE ;
private Object data ;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static EnumSingleton getInstance(){
return INSTANCE ;
}
}
注册式单例:
package com.example.demo.singleton.container;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class RegisterSingleton {
public static final Map<String,Object> ioc = new ConcurrentHashMap<>();
private RegisterSingleton(){}
public static Object getBean(String className){
synchronized (ioc){
if(!ioc.containsKey(className)){
try {
Object o = Class.forName(className).newInstance();
ioc.put(className,o);
return o ;
}catch (Exception e){
e.printStackTrace();
}
}
}
return ioc.get(className);
}
}
ThreadLocal单例
package com.example.demo.singleton.container;
public class ThreadLocalSingleton {
private ThreadLocalSingleton(){}
private static final ThreadLocal<ThreadLocalSingleton> threadLocalSingleton = new ThreadLocal<ThreadLocalSingleton>(){
@Override
protected ThreadLocalSingleton initialValue() {
return new ThreadLocalSingleton() ;
}
};
public static ThreadLocalSingleton getInstance(){
return threadLocalSingleton.get();
}
}