面试题答案
一键面试ThreadLocal的作用
ThreadLocal为每个使用该变量的线程提供独立的变量副本,使得每个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。这在多线程环境下,能有效地避免共享变量带来的线程安全问题,同时简化了多线程编程,因为每个线程只需要关注自己的副本。
简单使用场景举例
假设在一个Web应用中,每个请求处理线程需要有自己独立的数据库连接对象。这样每个线程在进行数据库操作时不会相互干扰。
public class DatabaseConnectionUtil {
// 创建ThreadLocal对象来管理数据库连接
private static final ThreadLocal<Connection> connectionThreadLocal = ThreadLocal.withInitial(() -> {
try {
// 这里假设使用JDBC获取连接
return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password");
} catch (SQLException e) {
throw new RuntimeException("Failed to create database connection", e);
}
});
public static Connection getConnection() {
return connectionThreadLocal.get();
}
public static void closeConnection() {
Connection connection = connectionThreadLocal.get();
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
connectionThreadLocal.remove();
}
}
}
}
在上述代码中,connectionThreadLocal
为每个线程维护一个独立的数据库连接。在请求处理线程中,可以通过DatabaseConnectionUtil.getConnection()
获取当前线程对应的数据库连接,在处理完后通过DatabaseConnectionUtil.closeConnection()
关闭连接并移除ThreadLocal中的副本,确保资源释放。