@runzhliu
2018-04-22T00:19:26.000000Z
字数 590
阅读 5185
jvm volatile scala
记录代码块的运行时间,在 Scala 中,会经常用到一个方法:
def benchmark[T](f: => T): T = {val start = System.nanoTime()result = fprintln(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 = fprintln(s"time: [ ${System.nanoTime() - start} ]")result}
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其他线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
