【发布时间】:2015-06-17 15:02:24
【问题描述】:
在多线程程序中,如果我们有一个静态变量,那么每个线程是否都有自己的变量副本,并且在静态变量的情况下,一个线程所做的更改是否对另一个线程可见?请解释
【问题讨论】:
标签: java
在多线程程序中,如果我们有一个静态变量,那么每个线程是否都有自己的变量副本,并且在静态变量的情况下,一个线程所做的更改是否对另一个线程可见?请解释
【问题讨论】:
标签: java
所有变量1在所有线程之间共享。
只有代码可见性由变量类型(例如静态/成员、公共/私有)定义 - 而不是线程可见性。 (volatile 修饰符会影响线程访问,但它本身通常是不够的。)
使用正确的同步(和/或 volatile 变量)对于变量的“线程安全”访问是必需的,并且所有可以从中访问的数据可以被多个线程访问。如果没有正确的同步,就不能保证另一个线程会“看到”对 [静态] 变量的更改。
1 可以创建ThreadLocal '变量'(通过间接对象),但这应该很少见。
【讨论】:
在多线程程序中,如果我们有一个静态变量,那么每个线程是否都有自己的变量副本
没有。如果需要,可以使用ThreadLocal
在静态变量的情况下,一个线程所做的更改对另一个线程可见
不是马上。另一个线程可能仍缓存旧值。为保证更改对其他线程可见,您有多种选择。您可以使用锁、synchronized 块/方法、创建变量 volatile 或使用一些现有的线程安全实用程序类,例如 AtomicReference。
【讨论】:
如果多个线程访问同一个静态变量,所有线程都可以看到变化。
因此,如果多个线程正在访问同一个变量,您将需要为该变量使用锁以保证线程安全。
【讨论】:
是的,与局部变量不同,静态变量在线程之间共享。 更多参考:http://java67.blogspot.com/2012/11/what-is-static-class-variable-method.html
【讨论】:
有一个经典的例子----生产者和消费者。这启发我们,如果要在其他线程中发现变量的变化,必须考虑每个线程在 CPU 中的占有时间。 EX:变量可能只是在一个线程中更改,而另一个线程没有使用CPU,因此找不到更改。 当然,你可以使用
synchronized
限制线程改变静态变量的行为(多线程时)。但是你必须知道CPU的交叉使用,这意味着如果你没有明确定义它们的优先级,你就不知道多个线程的运行方式。
【讨论】: