我在下面的博客中讨论了 ThreadLocals 的概念:
https://www.baeldung.com/java-threadlocal
它说“不要将 ThreadLocal 与 ExecutorService 一起使用”
它说明了以下使用 ThreadLocals 的示例。
public class ThreadLocalWithUserContext implements Runnable {
private static ThreadLocal<Context> userContext
= new ThreadLocal<>();
private Integer userId;
private UserRepository userRepository = new UserRepository();
@Override
public void run() {
String userName = userRepository.getUserNameForUserId(userId);
userContext.set(new Context(userName));
System.out.println("thread context for given userId: "
+ userId + " is: " + userContext.get());
}
// standard constructor
}
在帖子的末尾,它提到:
如果我们想使用 ExecutorService 并向其提交 Runnable,使用 ThreadLocal 将产生不确定的结果——因为我们不能保证给定 userId 的每个 Runnable 操作在每次执行时都会由同一个线程处理.
因此,我们的 ThreadLocal 将在不同的 userId 之间共享。这就是为什么我们不应该将 TheadLocal 与 ExecutorService 一起使用。只有当我们完全控制哪个线程将选择执行哪个可运行操作时才应该使用它。
这个解释对我来说是一个保镖。我试图专门针对这一点在网上做一些研究,但我没有得到太多帮助,请高手详细说明一下上述解释吗?是作者的观点还是真正的威胁?
慕容708150
ABOUTYOU
湖上湖
慕桂英546537
慕码人2483693
随时随地看视频慕课网APP
相关分类