当一个synchronized方法完成时,它是否只将它修改的数据推送到主存储器或所有成员变量,类似于同步方法执行时,它是否只读取主内存所需的数据,还是清除所有缓存中的成员变量并从主内存中读取它们的值?例如
public class SharedData
{
int a; int b; int c; int d;
public SharedData()
{
a = b = c = d = 10;
}
public synchronized void compute()
{
a = b * 20;
b = a + 10;
}
public synchronized int getResult()
{
return b*c;
}
}
在上面的代码中,假设compute由threadA执行,getResult由threadB执行.在执行compute之后,threadA会用a和b更新主内存,还是会更新a,b,c和d.在执行getResult之前,threadB只从主内存中获取b和c的值,还是清除缓存并获取所有成员变量a,b,c和d的值?
解决方法:
synchronized确保您拥有一致的数据视图.这意味着您将读取最新值,其他缓存将获得最新值.缓存非常智能,可以通过特殊总线相互通信(不是JLS要求的,但允许的话).这种总线意味着它不需要触摸主存储器来获得一致的视图.