第一个类在setter之前使用synchronized
关键字,而在第二个类中,我只是将String字段标记为volatile
。
public class MyBean{
private String strValue;
public synchronized void setStrValue(String strValue){
this.strValue=strValue;
}
public String getStrValue(){
return strValue
}
}
和
public class MyBean{
private volatile String strValue;
public void setStrValue(String strValue){
this.strValue=strValue;
}
public String getStrValue(){
return strValue
}
}
从另一个线程更新的一个线程中,这两段代码是否与读取更新值有关?
e.g。如果同一个MyBean
实例传递给两个线程 - 线程 - A& thread - B,如果target要有线程 - 在线程-B完成修改后读取更新的值,这两个代码从那个角度来看是否相同?
此外,在第二个版本中(即当字段标记为volatile时) - 如果多个线程可以作为编写者,是否必须在setter之前放置synchronized
? volatile
对于setter方法的多个编写器的情况有意义吗?
如果只有一个编写器线程,我的假设是否正确,两个代码是等价的?
对于多个作者的情况,正确的版本是使用synchronized
还是volatile
两者(如果不想阻止读者)?