@runzhliu
2018-04-22T00:19:26.000000Z
字数 590
阅读 5054
jvm
volatile
scala
记录代码块的运行时间,在 Scala 中,会经常用到一个方法:
def benchmark[T](f: => T): T = {
val start = System.nanoTime()
result = f
println(s"time: [ ${System.nanoTime() - start} ]")
result
}
但是在 JVM 中的某些运行时优化技术,可能会去除调用 f
代码块的语句,那么得到的运行时间就不是真正的运行时间了。于是为了避免这种情况,可以把代码块的返回值,赋予名为 result
的 Volatile
的字段。修改代码如下:
@volatile var result: Any = _
def benchmark[T](f: => T): T = {
val start = System.nanoTime()
result = f
println(s"time: [ ${System.nanoTime() - start} ]")
result
}
volatile
关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其他线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。