Java 同一变量的后续读取。如果没有后续读取(可以在本地对象的实例字段中验证),则volatile修饰符无效。但是,如果对象确实脱离了上下文,即使没有volatile,写入也无法省略,它可能只会被推迟到下一个写入障碍。@Holger这是否意味着标记字段volati

Java 同一变量的后续读取。如果没有后续读取(可以在本地对象的实例字段中验证),则volatile修饰符无效。但是,如果对象确实脱离了上下文,即使没有volatile,写入也无法省略,它可能只会被推迟到下一个写入障碍。@Holger这是否意味着标记字段volati,java,scala,jvm,dead-code,jvm-languages,Java,Scala,Jvm,Dead Code,Jvm Languages,同一变量的后续读取。如果没有后续读取(可以在本地对象的实例字段中验证),则volatile修饰符无效。但是,如果对象确实脱离了上下文,即使没有volatile,写入也无法省略,它可能只会被推迟到下一个写入障碍。@Holger这是否意味着标记字段volatile的提示毫无意义?#2似乎相关,但我找不到有关这种特定类型优化的任何信息。您能提供参考吗?这尤其适用于在循环中执行整个过程时,编译器可能会决定只使用循环执行的最后一个结果,这反过来会导致以前的所有迭代都受到DCE的约束。@Aliaxander


同一变量的后续读取。如果没有后续读取(可以在本地对象的实例字段中验证),则
volatile
修饰符无效。但是,如果对象确实脱离了上下文,即使没有
volatile
,写入也无法省略,它可能只会被推迟到下一个写入障碍。@Holger这是否意味着标记字段
volatile
的提示毫无意义?#2似乎相关,但我找不到有关这种特定类型优化的任何信息。您能提供参考吗?这尤其适用于在循环中执行整个过程时,编译器可能会决定只使用循环执行的最后一个结果,这反过来会导致以前的所有迭代都受到DCE的约束。@Aliaxander re:#2,这是我在某个时候读过的博客上写的。我创建了一个小的基准来测试它,在我的例子中(
build1.8.0_45-b14
)volatile是不必要的。迪马的回答在这一点上可能有一定的价值。我将更新我的答案,以排除未经确认的部分。必须强调的是,JVM也可以删除对
volatile
变量的写入。
volatile
修饰符仅保证同一变量的写入和后续读取之间的“发生在之前”关系。如果没有后续读取(可以在本地对象的实例字段中验证),则
volatile
修饰符无效。但是,如果对象确实脱离了它的上下文,即使没有
volatile
,写入也不能省略,它可能只会被推迟到下一个写入障碍。@Holger这是否意味着标记字段
volatile
的提示毫无意义?
def timed[T](body: => T) = {
  val start = System.currentTimeMillis
  blackHole = body
  val end = System.currentTimeMillis
  end - start
}
@volatile
var blackHole: Any = _