常用的一些单例模式:
饿汉式单例
package com.example.demo.singleton;
/**
* @author wangjian
* @Describe 饿汉式单例
*/
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;
/**
* 双重检查锁单例
* @author wangjian
*/
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;
/**
* 内部类实现单例
* @author wangjian
*/
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;
/**
* 枚举式单例
* @author wangjian
*/
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;
/**
* spring 内部实现的注册式单例
* @author wangjian
*/
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;
/**
* 线程内的单例模式
* @author wangjian
*
*/
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();
}
}