【发布时间】:2018-09-18 07:34:18
【问题描述】:
我正在阅读 this 关于 Java 中的 ThreadLocal 对象的文章,试图了解为什么以及何时使用它们。在文章中,我遇到了一个示例,旨在演示如何使用 ThreadLocal。这是一个应该是事务管理器的类,它使用了一个在整个类中使用的静态 transactionID 变量。为了使类线程安全,它使用 ThreadLocal 作为 transactionID:
public class TransactionManager {
private static final ThreadLocal<String> context = new
ThreadLocal<String();
public static void startTransaction() {
//logic to start a transaction
//...
context.set(generatedId);
}
public static String getTransactionId() {
return context.get();
}
public static void endTransaction() {
//logic to end a transaction
//…
context.remove();
}
}
我的问题是,为什么不直接将 transactionID 设为实例变量,而不是一开始就将其设为静态?这样你就不需要使用 ThreadLocal 变量。
【问题讨论】:
-
因为那么你需要一个单独的
TransactionManager每个线程,你不能静态调用TransactionManager.startTransaction()。 -
@chrylis 每个线程有一个单独的
TransactionManager是否有缺点,例如开销? -
相对于全局?每线程通常必要以确保正确处理。
标签: java multithreading concurrency thread-local