本文藉由併發環境下使用執行緒不安全的******dateformat優化案例,幫助大家理解threadlocal.
public class dateutil catch (parseexception e)
}}
首先分析下:
該處的函式parseymdhms()使用了synchronized修飾,意味著該操作是執行緒不安全的,所以需要同步,執行緒不安全也只能是******dateformat的parse()方法,檢視下原始碼,在******dateformat裡面有乙個全域性變數
protected calendar calendar;
date parse()
該clear()操作會造成執行緒不安全.
此外使用synchronized 關鍵字對效能有很大影響,尤其是多執行緒的時候,每一次呼叫parseymdhms方法都會進行同步判斷,並且同步本身開銷就很大,因此這是不合理的解決方案
執行緒不安全是源於多執行緒使用了共享變數造成,所以這裡使用threadlocal來給每個執行緒單獨建立副本變數,先給出**,再分析這樣的解決問題的原因.
/**
* 日期工具類(使用了threadlocal獲取******dateformat,其他方法可以直接拷貝common-lang)
* @author niu li
* @date 2016/11/19
*/public class dateutil
};sdfmap.put(pattern,sdfthread);}}
}return sdfthread.get();
}/**
* 按照指定pattern解析日期
* @param date 要解析的date
* @param pattern 指定格式
* @return 解析後date例項
*/public static date parsedate(string date,string pattern)
try catch (parseexception e)
return null;
}/**
* 按照指定pattern格式化日期
* @param date 要格式化的date
* @param pattern 指定格式
* @return 解析後格式
*/public static string formatdate(date date,string pattern)else
}}
在主線程中執行乙個,另外兩個在子執行緒執行,使用的都是同乙個pattern
public static void main(string args) ).start();
new thread(()->).start();
}
詳看: ThreadLocal使用介紹
首先有幾點需要大家清楚的 1 threadlocal 只是對需要儲存的物件的管理,而儲存實際是由當前thread 負責。個人理解為threadlocal 是乙個操作thread.threadlocals 的工具。2 使用threadlocal 可以使物件達到執行緒隔離的目的。同乙個threadloc...
Java事務 三 使用ThreadLocal
一.為什麼使用threadlocal 如果涉及到呼叫多個service,那我是不是還得從controller層傳遞connection?從而不會影響其他執行緒中的例項變數,所以threadlocal可以實現執行緒範圍內資料共享。二.如何使用threadlocal 1.寫乙個transactionma...
ThreadLocal的作用與使用
在我們程式設計時,如果遇到多個執行緒訪問同乙個變數應該怎樣實現?有人說使用同步。是的同步可以解決這種問題,但它是有弊端的,涉及到何時加鎖與釋放鎖等並且執行緒訪問鎖時需要等待,這樣很浪費時間。有乙個更好的方案就是使用threadlocal工具類,之前參加了乙個專案,本專案涉及到分庫,在業務進行中需要根...