我有一个静态变量,我希望每个线程都是唯一的。
所有静态变量都是这种情况吗?或者不能保证。也就是说,线程偶尔会更新主内存中的静态变量值,还是保留给自己?
如果无法保证这一点,Java中是否存在静态和线程唯一的任何类型的变量?什么东西本质上是一个线程的全局,但隐藏在其他线程?
答案 0 :(得分:15)
我认为你要找的是Java的ThreadLocal。
此类提供线程局部变量。这些变量与它们的正常对应物的不同之处在于,访问一个变量的每个线程(通过其get或set方法)都有自己独立初始化的变量副本。
请注意,如果你进行线程池,这可能会给你带来麻烦,因为你可能认为你正在获得一个新的线程,从它开始一个新进程的角度来看,但是发生的事情是你重用了一个完成的线程处理其他数据因此有遗留问题,当它们在野外发生时很难调试。
Here是关于使用ThreadLocal的教程。
答案 1 :(得分:4)
static
变量在线程之间共享。
如果您希望每个线程的变量都是唯一的,您可能需要使用ThreadLocal
:
// Atomic integer containing the next thread ID to be assigned
private static final AtomicInteger nextId = new AtomicInteger(0);
// Thread local variable containing each thread's ID
private static final ThreadLocal<Integer> threadId =
new ThreadLocal<Integer>() {
@Override protected Integer initialValue() {
return nextId.getAndIncrement();
}
};