您需要在这里进行同步(有一个警告,我将在后面讨论)。
主要问题是读取器线程可能永远看不到写入器线程进行的任何更新。通常,任何给定的写入最终都会被看到。但是在这里,您的更新循环非常简单,以至于写入可以轻松地保存在缓存中,而永远不会写入主内存。因此,您实际上必须在这里同步。
编辑11/2017
我将更新此内容,并说一个值可能在缓存中保留这么长时间可能是不现实的。我认为,这样的变量访问可以由编译器优化并保存在寄存器中,这是一个问题。因此,仍然需要同步(或
volatile)来告知优化器确保为每个循环实际获取一个新值。
因此,您要么需要使用
volatile,要么需要使用(静态)getter和setter方法,并且
synchronized在这两种方法上都需要使用关键字。对于偶尔这样的写法,
volatile关键字的权
重要 轻 得多 。
需要注意的是,如果您真的不需要查看来自写入线程的及时更新,则不必进行同步。如果无限期的延迟不会影响您的程序功能,则可以跳过同步。但是在计时器上这样的事情看起来并不适合用来省略同步。
编辑:Per Brian Goetz在 Java Java Concurrency in Practice中 ,不允许Java / a
JVM向您显示“不确定”值-从未写入的值。从技术上讲,这些值称为“凭空传播”的值,并且Java规范不允许使用它们。您可以确保看到先前对全局变量进行的写操作,它是初始化时使用的零,也可以是后续的写操作,但不允许其他值。



