Heim  >  Artikel  >  Java  >  So wenden Sie ThreadLocal in Java an

So wenden Sie ThreadLocal in Java an

PHPz
PHPznach vorne
2023-05-04 13:01:061468Durchsuche

1. Anwendungen in verschiedenen Frameworks

Das Spring-Framework verwendet ThreadLocal, um Verbindungen zu verwalten. Wenn eine Transaktion fehlschlägt, kann dies keinen Einfluss auf den Transaktionsprozess oder die Ergebnisse anderer Threads haben ORM-Framework und Mybatis, von denen jeder gehört hat, werden ebenso wie SqlSession von ThreadLocal verwaltet.

//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. Verhindern Sie Speicherlecks

Normalerweise verwenden wir die folgende Methode, um ThreadLocal zu betreiben. Nach der Verwendung von Threadlocal müssen wir es entfernen, um Speicherlecks zu verhindern.

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();
}

Das obige ist der detaillierte Inhalt vonSo wenden Sie ThreadLocal in Java an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen