3 回答
TA贡献1877条经验 获得超6个赞
这是从scala邮件列表中获取的,并lazy根据Java代码(而非字节码)提供了实现细节:
class LazyTest {
lazy val msg = "Lazy"
}
被编译为等效于以下Java代码的内容:
class LazyTest {
public int bitmap$0;
private String msg;
public String msg() {
if ((bitmap$0 & 1) == 0) {
synchronized (this) {
if ((bitmap$0 & 1) == 0) {
synchronized (this) {
msg = "Lazy";
}
}
bitmap$0 = bitmap$0 | 1;
}
}
return msg;
}
}
TA贡献1824条经验 获得超5个赞
使用Scala 2.10,像这样的惰性值:
class Example {
lazy val x = "Value";
}
被编译为类似于以下Java代码的字节代码:
public class Example {
private String x;
private volatile boolean bitmap$0;
public String x() {
if(this.bitmap$0 == true) {
return this.x;
} else {
return x$lzycompute();
}
}
private String x$lzycompute() {
synchronized(this) {
if(this.bitmap$0 != true) {
this.x = "Value";
this.bitmap$0 = true;
}
return this.x;
}
}
}
请注意,位图由表示boolean。如果添加另一个字段,则编译器将增加该字段的大小,使其能够表示至少2个值,即表示为byte。这仅适用于大量课程。
但是您可能想知道为什么这可行?进入同步块时,必须清除线程本地缓存,以便将非易失性x值刷新到内存中。这篇博客文章给出了解释。
添加回答
举报