解决单例 Bean 中的线程安全问题
在实际项目开发中,绝大多数的 Bean 是无状态的,就是没有实际变量,都是 Dao,Serivce 一类的,但是不排除会存在可变的成员变量,解决的办法是利用 ThreadLocal
装配这个成员变量,并重写对应的 getter 和 setter
下面是一个简单的示例,利用懒汉式实现 singleton,并提供了一些 ThreadLocal 的方法
public class MyClass {
private static MyClass instance;
private final ThreadLocal<Integer> threadLocalData = new ThreadLocal<>();
// 防止类外部直接实例化的私有构造函数
private MyClass() {}
// 获取singleton实例的静态方法
// 懒汉模式,需要才构建
public static MyClass getInstance() {
if (instance == null) {
synchronized (MyClass.class) {
if (instance == null) {
instance = new MyClass();
}
}
}
return instance;
}
public void setData(int value) {
// 设置线程特定数据
threadLocalData.set(value);
}
public int getData() {
// 获取线程特定的数据
Integer data = threadLocalData.get();
if (data != null) {
return data;
} else {
// 如果未为此线程设置数据,则返回默认值
return 0;
}
}
// ThreadLocal会存在内存泄漏,所以一点要清除线程数据
public void clearData() {
// 清除此线程的线程特定数据
threadLocalData.remove();
}
}