两个线程之间是否共享一个静态变量?

时间:2015-04-12 04:50:23

标签: java

在多线程程序中,如果我们有一个静态变量,那么每个线程都有自己的变量副本,并且在静态变量的情况下,由另一个线程对另一个线程可见的更改?请解释

5 个答案:

答案 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的交叉使用,这意味着你不会知道多个线程'如果你没有明确地确定他们的优先权,那就是运行方式。