使用ThreadLocal和AtomicInteger將int屬性改爲線程安全的計數器

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章