对于在同步方法或块中访问对象状态是否安全,存在问题的答案。我的问题:在一个同步块内访问对象X是否安全,同步块位于另一个对象Y上,并且存在多个writer X线程?
public class X{
private int value = 0;
/** set method will be invoked by multiple threads**/
public void set(int v){
this.value = v;
}
public int value(){
return value;
}
}
public class Tester{
private final Object Y = new Object();
public void test(X x){
synchronized(Y){
System.out.println(x.value()); // is it guaranteed that x.value will be read from memory and not from the current thread's cache ?
}
}
}
我知道在其上定义了同步块的对象的状态可以安全地访问而无需使用volatile,但是如果在另一个对象上定义了该同步块怎么办?
与问题无关:
示例代码的第一个问题:
public void set(int v){
this.value = v;
}
这是非常差的代码质量,应该这样写:
public final void setValue(final int value) {
this.value = value;
}
除了添加最终修饰符之外,这没有性能优势,它可以改善字节码优化,这只是设置器的设计模式。
示例代码的第二个问题:
public int value(){
return value;
}
吸气剂的正确设计模式是:
public final int getValue() {
return value;
}
示例代码的第三个问题:
private final Object Y = new Object();
字段“ Y”不是静态的,因此不是常量,因此该字段的正确命名约定为:
private final Object y = new Object();
示例代码的第四个问题是在括号后没有大括号的情况下放置大括号,我的意思是不这样做
){
您确实应该这样做:
) {