在多线程程序中,如果我们有一个静态变量,那么每个线程都有自己的变量副本,并且在静态变量的情况下,由另一个线程对另一个线程可见的更改?请解释
答案 0 :(得分:5)
所有变量 1 在所有线程之间共享。
只有代码可见性由变量类型(例如,static / member,public / private)定义 - 但不是线程可见性。 (volatile修饰符会影响线程访问,但本身通常是不够的。)
"线程安全"需要使用正确的同步(和/或易失性变量)。访问变量,以及可以从中获取的所有数据,可以访问多个线程。如果没有正确的同步,则无法保证其他线程会看到'更改为[静态]变量。
1 可以创建ThreadLocal'变量' (通过间接对象),但这应该是一种罕见的情况。
答案 1 :(得分:4)
在多线程程序中,如果我们有一个静态变量,那么每个线程都有自己的变量副本
没有。如果您需要,可以使用ThreadLocal
是在静态变量
的情况下,一个线程对另一个线程可见的更改
不是立即。另一个线程可能仍然具有缓存的旧值。为了保证更改对其他线程可见,您有多个选项。您可以使用锁,synchronized
块/方法,生成变量volatile
或使用某些现有的线程安全实用程序类,如AtomicReference
。
答案 2 :(得分:0)
如果多个线程正在访问相同的静态变量,则所有线程都可以看到更改。
因此,如果多个线程正在访问同一个变量,则需要使用锁来使该变量具有线程安全性。
答案 3 :(得分:0)
是的,静态变量在线程之间共享,与局部变量不同。 有关更多参考:http://java67.blogspot.com/2012/11/what-is-static-class-variable-method.html
答案 4 :(得分:0)
有一个经典的例子----生产者和消费者。这激发了我们,如果你想在其他线程中找到变量的变化,你必须考虑每个线程在CPU中的拥有时间。 EX:变量可能只是在一个线程中更改,而另一个线程没有使用CPU。因此它无法找到更改。 当然,你可以使用
synchronized
限制线程的行为(当多线程时)改变静态变量。但是你必须知道CPU的交叉使用,这意味着你不会知道多个线程'如果你没有明确地确定他们的优先权,那就是运行方式。