Han*_*örr 13 performance scala lazy-initialization
可能重复:
lazy val的(隐藏)成本是多少?(斯卡拉)
Scala允许定义惰性值
lazy val maybeUnusedValue = someCostlyInitialization
Run Code Online (Sandbox Code Playgroud)
where someCostlyInitialization
仅在第一次使用时评估maybeUnusedValue
.也就是说,它最多被评估一次,如果maybeUnusedValue
从未使用过,它也从未被评估过.
这线程安全吗?这有什么性能影响?如果这是线程安全的,它必须以某种方式使用某种同步/使用Java volatile.不幸的是,Scala语言规范对此没有任何说明.
Ale*_*nov 12
使用双重检查锁定使其成为线程安全的http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html显然这意味着访问延迟的vals比非懒惰慢.
更新:OOPS,正如Vasil指出的那样,问题是另一个线程的副本,当它发生时,这个答案也是如此.
我上了这堂课:
class Foo {
lazy val test = "hi"
}
Run Code Online (Sandbox Code Playgroud)
编译和反编译(与jd-gui):
public class Foo
implements ScalaObject
{
private String test;
public volatile int bitmap$0;
public String test()
{
if (
(this.bitmap$0 & 0x1) == 0);
synchronized (this)
{
if (
(this.bitmap$0 & 0x1) == 0) {
this.test = "hi"; this.bitmap$0 |= 1; } return this.test;
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,它使用带有volatile变量的双重检查范例.所以我认为这是安全的
归档时间: |
|
查看次数: |
4978 次 |
最近记录: |