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多執行緒與併發之ThreadLocalJava執行緒thread
- parallelStream中的執行緒安全問題Parallel執行緒
- Java 執行緒安全問題的本質Java執行緒
- Java中解決多執行緒資料安全問題Java執行緒
- Java執行緒(一):執行緒安全與不安全Java執行緒
- ThreadLocal執行緒重用時帶來的問題thread執行緒
- 啃碎併發(五):Java執行緒安全特性與問題Java執行緒
- 執行緒安全處理之Threadlocal執行緒thread
- 模板方法中的執行緒安全問題執行緒
- lambda中stream執行緒安全的問題執行緒
- 03 執行緒安全問題執行緒
- SimpleDateFormat 執行緒安全問題ORM執行緒
- Java 執行緒安全 與 鎖Java執行緒
- JUC之集合中的執行緒安全問題執行緒
- ArrayList 的執行緒安全問題執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- 子執行緒使用父執行緒RequestScope作用域Bean問題的探究執行緒Bean
- Java之執行緒安全問題的3種處理方式(通過執行緒同步)Java執行緒
- Java執行緒安全Java執行緒
- 詳解執行緒池的作用及Java中如何使用執行緒池執行緒Java
- Java中列舉的執行緒安全性及序列化問題Java執行緒
- 【多執行緒】ThreadLocal原理執行緒thread
- 探究Spring中Bean的執行緒安全性問題SpringBean執行緒
- 執行緒本地ThreadLocal的介紹與使用!執行緒thread
- java 執行緒安全問題,解決執行緒安全問題——同步程式碼塊,同步方法,Lock鎖,Object類中wait方法,notify方法。等待喚醒案例。Java執行緒ObjectAI
- 05.java多執行緒問題Java執行緒
- Java多執行緒開發|volatile與偽共享問題Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 從FMDB執行緒安全問題說起執行緒
- 單例模式執行緒安全reorder問題單例模式執行緒
- Java併發專題(二)執行緒安全Java執行緒
- java中執行緒池的生命週期與執行緒中斷Java執行緒
- Java與執行緒Java執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- 執行緒中斷以及執行緒中斷引發的那些問題執行緒
- 單例模式中可能存在的一些問題(執行緒安全問題)單例模式執行緒