今天就跟大家聊聊有關java中ThreadLocal的使用場景有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
1.SpringMVC,Spring Web MVC是一種基于Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架。2.Shiro,Apache Shiro是Java的一個安全框架。3.Mybatis,MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。4.Dubbo,Dubbo是一個分布式服務框架。5.Maven,Maven是個項目管理和構建自動化工具。6.RabbitMQ,RabbitMQ是用Erlang實現的一個高并發高可靠AMQP消息隊列服務器。7.Ehcache,EhCache 是一個純Java的進程內緩存框架。
1、各種框架中的應用
Spring框架的事務管理中使用ThreadLocal來管理連接,每個線程是單獨的連接,當事務失敗時不能影響到其他線程的事務過程或結果,還有大家耳聞目睹的ORM框架、Mybatis也是用ThreadLocal管理,SqlSession也是如此。
//Spring TransactionSynchronizationManager類
@Override
protected void doBegin(Object transaction, TransactionDefinition definition) {
DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;
Connection con = null;
try {
//此處省略N行代碼
if (txObject.isNewConnectionHolder()) {
//綁定數據庫連接到線程中
TransactionSynchronizationManager.bindResource(obtainDataSource(), txObject.getConnectionHolder());
}
}
catch (Throwable ex) {
if (txObject.isNewConnectionHolder()) {
//當發生異常時,移除線程中的連接
DataSourceUtils.releaseConnection(con, obtainDataSource());
txObject.setConnectionHolder(null, false);
}
throw new CannotCreateTransactionException("Could not open JDBC Connection for transaction", ex);
}
}2、防止內存泄漏
通常我們是使用如下的方式操作ThreadLocal,在使用完threadlocal后一定要remove掉,防止內存泄露。
private static final ThreadLocal<LoginUser> loginUserLocal = new ThreadLocal<LoginUser>();
public static LoginUser getLoginUser() {
return loginUserLocal.get();
}
public static void setLoginUser(LoginUser loginUser) {
loginUserLocal.set(loginUser);
}
public static void clear() {
loginUserLocal.remove();
}
//在使用完后一定要清理防止內存泄露
try{
loginUserLocal.set(loginUser);
//執行其他業務邏輯
}finally{
loginUserLocal.remove();
}看完上述內容,你們對java中ThreadLocal的使用場景有哪些有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。