Maison >Java >javaDidacticiel >Comment appliquer ThreadLocal en Java

Comment appliquer ThreadLocal en Java

PHPz
PHPzavant
2023-05-04 13:01:061524parcourir

1. Applications dans divers frameworks

Spring Framework utilise ThreadLocal pour gérer les connexions. Lorsqu'une transaction échoue, elle ne peut pas affecter le processus de transaction ou les résultats des autres threads. Le framework ORM et Mybatis dont tout le monde a entendu parler sont également gérés par ThreadLocal, tout comme 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. Prévenir les fuites de mémoire

Habituellement, nous utilisons la méthode suivante pour faire fonctionner ThreadLocal. Après avoir utilisé threadlocal, nous devons le supprimer pour éviter les fuites de mémoire.

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer