是否应该仅在同步代码中访问静态变量?

时间:2012-09-23 13:01:41

标签: java

在类中,如果有Static Variable,一些开发人员建议通过Synchronize Methods访问它们,因为当访问变量的进程正在运行时,另一个进程可以更改该变量的值。这是错的吗?它是否也与Thread Safe相关?

3 个答案:

答案 0 :(得分:1)

是的,这与线程安全有关,而不是与进程有关(每个进程通常都有自己的内存,因此没有对变量的共享访问权限。)

每当一个变量可以被多个线程访问时,您需要添加某种形式的同步,以确保在一个线程中所做的更改对其他线程可见,并且您对该变量的操作(以及可能的相关变量)不要互相干扰。

同步对静态变量的访问通常是一个好主意,因为通常很难排除它将从多个线程访问,特别是如果变量也是公共的。

如果此变量是常量,即它仅在静态初始化期间设置,并且在此之后永远不会更改,则可以将其设置为final而不是同步访问。类似地,根据变量的用途,也可能足以使其变为volatile,这至少可以确保对其值的更改立即对所有线程可见。

答案 1 :(得分:0)

仅仅因为变量static并不意味着需要保护它免受并发修改的影响。

答案 2 :(得分:0)

如果期望在并发环境中使用包含该变量的类,则静态变量不是final(或者是一个不可变对象),那么您最好通过同步对它的访问来控制,否则,如果你不这样做,因为同步方法或块的性能较低。