Scala SIP-20 은 "현재"버전보다 더 정확하지만 ~ 25 % 더 느린 lazy val의 새로운 구현을 제안합니다.
제안 구현 외모가 좋아 :
class LazyCellBase { // in a Java file - we need a public bitmap_0
public static AtomicIntegerFieldUpdater<LazyCellBase> arfu_0 =
AtomicIntegerFieldUpdater.newUpdater(LazyCellBase.class, "bitmap_0");
public volatile int bitmap_0 = 0;
}
final class LazyCell extends LazyCellBase {
import LazyCellBase._
var value_0: Int = _
@tailrec final def value(): Int = (arfu_0.get(this): @switch) match {
case 0 =>
if (arfu_0.compareAndSet(this, 0, 1)) {
val result = 0
value_0 = result
@tailrec def complete(): Unit = (arfu_0.get(this): @switch) match {
case 1 =>
if (!arfu_0.compareAndSet(this, 1, 3)) complete()
case 2 =>
if (arfu_0.compareAndSet(this, 2, 3)) {
synchronized { notifyAll() }
} else complete()
}
complete()
result
} else value()
case 1 =>
arfu_0.compareAndSet(this, 1, 2)
synchronized {
while (arfu_0.get(this) != 3) wait()
}
value_0
case 2 =>
synchronized {
while (arfu_0.get(this) != 3) wait()
}
value_0
case 3 => value_0
}
}
2013 년 6 월 현재이 SIP는 승인되지 않았습니다. 메일 링리스트 토론을 바탕으로 향후 버전의 Scala에 승인되어 포함될 것으로 예상됩니다. 결과적으로 Daniel Spiewak의 관찰 에 귀를 기울이는 것이 현명하다고 생각합니다 .
게으른 발은 무료가 아니거나 저렴하다. 최적화가 아닌 정확성을 위해 게으름이 절대적으로 필요한 경우에만 사용하십시오.
bitmap$0
현재 구현 (2.8) 에서는 필드가 일시적입니다.