java中ThreadLocal作用與執行緒安全問題
1.概念:
ThreadLocal是什麼呢?其實ThreadLocal並非是一個執行緒的本地實現版本,它並不是一個Thread,而是threadlocalvariable(執行緒區域性變數)。也許把它命名為ThreadLocalVar更加合適。執行緒區域性變數(ThreadLocal)其實的功用非常簡單,就是為每一個使用該變數的執行緒都提供一個變數值的副本,是Java中一種較為特殊的執行緒繫結機制,是每一個執行緒都可以獨立地改變自己的副本,而不會和其它執行緒的副本衝突。
2.以SimpleDateFormat執行緒非安全示例:
SimpleDateFormat(下面簡稱sdf)類內部有一個Calendar物件引用,它用來儲存和這個sdf相關的日期資訊,例如sdf.parse(dateStr), sdf.format(date) 諸如此類的方法引數傳入的日期相關String, Date等等, 都是交友Calendar引用來儲存的.這樣就會導致一個問題,如果你的sdf是個static的, 那麼多個thread 之間就會共享這個sdf, 同時也是共享這個Calendar引用, 並且, 觀察 sdf.parse() 方法,你會發現有如下的呼叫:
-
Date parse() {
-
calendar.clear(); // 清理calendar
-
... // 執行一些操作, 設定 calendar 的日期什麼的
-
calendar.getTime(); // 獲取calendar的時間
- }
這裡會導致的問題就是, 如果 執行緒A 呼叫了 sdf.parse(), 並且進行了 calendar.clear()後還未執行calendar.getTime()的時候,執行緒B又呼叫了sdf.parse(), 這時候執行緒B也執行了sdf.clear()方法, 這樣就導致執行緒A的的calendar資料被清空了(實際上A,B的同時被清空了). 又或者當 A 執行了calendar.clear() 後被掛起, 這時候B 開始呼叫sdf.parse()並順利i結束, 這樣 A 的 calendar記憶體儲的的date 變成了後來B設定的calendar的date
3.解決方案:
-
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
-
@SuppressWarnings("rawtypes")
-
private static ThreadLocal threadLocal = new ThreadLocal() {
-
protected synchronized Object initialValue() {
-
return new SimpleDateFormat(DATE_FORMAT);
-
}
-
};
-
-
DateFormat df = (DateFormat) threadLocal.get();
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1220276/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- java執行緒安全問題Java執行緒
- 深入JAVA執行緒安全問題Java執行緒
- Java多執行緒10:ThreadLocal的作用及使用Java執行緒thread
- parallelStream中的執行緒安全問題Parallel執行緒
- Java中解決多執行緒資料安全問題Java執行緒
- java多執行緒——ThreadLocalJava執行緒thread
- Java 執行緒安全問題的本質Java執行緒
- Java執行緒(一):執行緒安全與不安全Java執行緒
- 啃碎併發(五):Java執行緒安全特性與問題Java執行緒
- lambda中stream執行緒安全的問題執行緒
- 模板方法中的執行緒安全問題執行緒
- Java多執行緒與併發之ThreadLocalJava執行緒thread
- SimpleDateFormat 執行緒安全問題ORM執行緒
- Java 執行緒安全 與 鎖Java執行緒
- 執行緒安全處理之Threadlocal執行緒thread
- java多執行緒執行問題Java執行緒
- JUC之集合中的執行緒安全問題執行緒
- 請教:struts中action執行緒安全問題執行緒
- Java執行緒(篇外篇):執行緒本地變數ThreadLocalJava執行緒變數thread
- ArrayList 的執行緒安全問題執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- Java執行緒中斷與終止執行緒執行Java執行緒
- Jedis 與 MySQL的連線執行緒安全問題MySql執行緒
- java中執行緒安全的集合Java執行緒
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- 子執行緒使用父執行緒RequestScope作用域Bean問題的探究執行緒Bean
- java web執行緒安全的疑問JavaWeb執行緒
- Java靜態static工具類執行緒安全問題研究Java執行緒
- 詳解執行緒池的作用及Java中如何使用執行緒池執行緒Java
- Java執行緒安全Java執行緒
- Java - 執行緒安全Java執行緒
- 所謂的執行緒安全問題執行緒
- Java之執行緒安全問題的3種處理方式(通過執行緒同步)Java執行緒
- Java中列舉的執行緒安全性及序列化問題Java執行緒
- JAVA執行緒中的安全知識Java執行緒
- 多執行緒-執行緒安全問題的產生原因分析以及同步程式碼塊的方式解決執行緒安全問題執行緒
- Java中多執行緒的概述、實現方式、執行緒控制、生命週期、多執行緒程式練習、安全問題的解決...Java執行緒