項目有個單例對象內部有個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();
}