Scala懒惰值:绩效惩罚?线程防护? [复制
-
28-09-2019 - |
题
可能的重复:
懒瓦尔的(隐藏)成本是多少? (Scala)
Scala允许定义懒值
lazy val maybeUnusedValue = someCostlyInitialization
在哪里 someCostlyInitialization
仅首次使用 maybeUnusedValue
. 。也就是说,它最多一次进行评估,如果 maybeUnusedValue
从未使用过,也从未对其进行评估。
这个线程安全吗?这有什么影响?如果要进行螺纹安全,则必须以某种方式使用某种同步 /使用Java挥发性。不幸的是 Scala语言规范 什么也没说。
解决方案
它是使用双检查锁定的线程安全的 http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html 显然,这确实意味着访问懒惰的阀比非懒惰的阀要慢。
其他提示
更新:正如瓦西尔(Vasil)指出的那样,糟糕,问题是另一个线程的副本,正如它发生的那样,答案也是如此。
我上了这堂课:
class Foo {
lazy val test = "hi"
}
编译并分解(与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;
}
}
}
如您所见,它正在使用带有挥发性变量的双检查范式。所以我认为这是安全的
不隶属于 StackOverflow