正常的懒汉式实现方式:
public class SingletonDemo {
private static SingletonDemo instance=null;
/**
* 构造方法私有化,防止外部new出来实例对象
*/
private SingletonDemo(){
}
public static SingletonDemo getInstance(){
if(instance == null){
instance=new SingletonDemo();
}
return instance;
}
}
线程安全的实现方式:双重校验锁
public class SingletonDemo {
private volatile static SingletonDemo instance = null;
/**
* 构造方法私有化,防止外部new出来实例对象
*/
private SingletonDemo() {
}
public static synchronized SingletonDemo getInstance() {
if (instance == null) {
synchronized (SingletonDemo.class) {
if (instance == null) {
instance = new SingletonDemo();
}
}
}
return instance;
}
}
案例:利用ThreadLocal设计一个单例模式的线程上下文工具类,应用场景:线程上下文传参
public class ThreadContextUtil {
private static ThreadLocal<Map<String,Object>> threadContext = new ThreadLocal<Map<String,Object>>();
private static volatile ThreadContextUtil instance;
/**
* 构造方法私有化,防止外部new出来实例对象
*/
private ThreadContextUtil(){
}
public static synchronized ThreadContextUtil getInstance() {
if (instance == null) {
synchronized (ThreadContextUtil.class) {
if (instance == null) {
instance = new ThreadContextUtil();
}
}
}
return instance;
}
/**
* 设置键值
* @param key
* @param object
*/
public void set(final String key,final Object object) {
Map<String,Object> map = threadContext.get();
if (Objects.equal(null, map)) {
map = Maps.newHashMap();
}
map.put(key, object);
threadContext.set(map);
return ;
}
/**
* 移除键值
* @param key
*/
public void removeKey(String key) {
Map<String,Object> map = threadContext.get();
if (Objects.equal(null, map)) {
map = Maps.newHashMap();
}
map.remove(key);
threadContext.set(map);
return ;
}
/**
* 获得对应key的值
* @param key
* @return
*/
public Object get(String key) {
Map<String,Object> map = threadContext.get();
if (Objects.equal(null, map)) {
return null;
} else {
return map.get(key);
}
}
/**
* 清理所有
*/
public void clean() {
Map<String,Object> map = threadContext.get();
if (!Objects.equal(null, map)) {
map.clear();
threadContext.set(map);
}
}
}