在Java Concurrency一书中提到 - volatile变量的可见性效果超出了volatile变量本身的值。当线程A写入易失性变量并且随后线程B读取相同的变量时,在写入易失性变量之前,A可见的所有变量的值在读取volatile变量后变为B可见。因此,从内存可见性的角度来看,编写volatile变量就像退出synchronized块一样,读取volatile变量就像进入synchronized块一样。
因此,通过上述方法,volatile关键字的替代方法是使用同步的getter方法?我理解对volatile变量的任何更新都会传播到访问它的所有线程,并且使用volatile for read-only比使用synchronized块更好,因为它不会执行昂贵的锁定。
private volatile String shopName;
public boolean getShopName() {
if (shopName == null) {
synchronized(this) {
if (shopName == null) {
shopName = "abc";
}
}
}
return shopName;
}