【发布时间】:2016-03-03 06:43:51
【问题描述】:
我已经阅读了很多关于为什么ThreadLocal 变量需要是静态的文章(虽然不是必需的),但我不明白为什么它应该是静态的。
我已经阅读了 here 和许多其他链接,但没明白。
我做过类似的事情
public class ThreadLocalDemo{
public static void main(String[]args)throws Exception{
SharedRersource r1= new SharedRersource();
Thread t1= new Thread(r1);
Thread t2= new Thread(r1);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Main thread Exiting...");
}
}
class SharedRersource implements Runnable{
private ThreadLocal<Integer> threadId = new ThreadLocal(){
protected Integer initialValue(){
return (int)(Math.random()*100);
}
};
public void run(){
try{
Thread.sleep(2000);
}
catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(threadId.get());
}
};
这里的线程 t1 和 t2 拥有 threadId 的私有副本,而不是为什么它应该是静态的
请给我一个更好的理解。 谢谢
【问题讨论】:
-
您链接到的问题的答案很好地解释了它。你不明白什么?您是否了解如果您有 10 个对象,每个对象都有一个 ThreadLocal 实例字段,那么您有 10 个不同的地方可以将某些状态与当前线程相关联?你通常不希望那样。您通常想要的是“当前正在使用此线程的用户是 John”,或“与当前线程关联的事务是那个”。
-
技术上不一定是这样,但你能说出你不希望它是静态的一件事吗?
-
@Voo :问题是我只是看到 SpringSecurity ContextHolder 类,其中 Authentication 对象保存在 ThreadLocal 变量中。所以要了解我需要了解 ThreadLocal 状态
-
@JBNizet:为什么当每个线程本地副本都是每个线程私有时,我需要 10 个不同的对象
-
每当我遇到“我为什么需要这个?”问题(例如,每当我想到一个问题时),我发现最好的方法是将知识藏在脑海中,不要想太多。然后,当实际工作中出现这个话题时,我可以将这个想法应用到那个具体的例子中。我查看“最佳实践”的答案,然后提出替代方案——我经常最终意识到为什么最佳实践在那个特定情况下也是最好的。重复几次,然后你就知道为什么这是个好主意了。
标签: java multithreading