项目有个单例对象内部有个int属性作为计数器,之前的同事可能没有考虑到多线程安全问题,在多线程环境下该int属性的值完全乱了;但是该单例类已经到处使用了,代码不好动,只好使用ThreadLocal来修改了。
ThreadLocal是每个线程有一份独立的数据,也就不会有多线程并发的问题了。
首先是定义,如果当前线程没有初始化该值就会执行里面的initialValue():
private static ThreadLocal<AtomicInteger> timesThreadLocal = new ThreadLocal<AtomicInteger>() {
@Override
protected AtomicInteger initialValue(){
return new AtomicInteger(0);
}
};
获取需要使用get方法
获取:
if(timesThreadLocal.get() < Constant.MAX_TIMES)
获取并自增:
timesThreadLocal.get().getAndIncrement()
防止内存泄漏,线程退出时remove
finally {
timesThreadLocal.remove();
}