ThreadLocal使用案例

2021-09-19 12:27:53 字數 1442 閱讀 2419

本文藉由併發環境下使用執行緒不安全的******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工具類,之前參加了乙個專案,本專案涉及到分庫,在業務進行中需要根...