如果我有一个具有属性private int i;
的对象,我知道我可以让getter和setter方法“同步”如此...但是因为可能会在以后添加访问/更改的其他方法直接i
,有没有办法声明i
是“同步”属性?
public class SharedObject {
int i;
synchronized public int getI() {
return i;
}
synchronized public void setI(int i) {
this.i = i;
}
public void badMethod() { <<-- added at later date by forgetful programmer
// accidentally messes up 'i' because method is not "synchronized" !!
}
}
我想也许这可行,但事实并非如此:
public class SharedObject {
synchronized int i; <<-- this won't compile
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public void badMethod() {
// cannot mess up 'i', because 'i' is declared as 'synchronized'
}
}
答案 0 :(得分:1)
无法将成员变量声明为synchronized
。
但是,如果i
表示对象的独立状态 - 换句话说,如果i
可以设置并独立于其他状态,并且您不依赖于同步i
的getter和setter可以使用其他synchronized
方法序列化访问权限,然后您可以将i
声明为volatile
。
您可以考虑将所有并发关键代码移动到它自己的类(甚至声明类final
),这可能会使意图更清晰。但如果一个健忘的程序员&#34;可以对源代码进行更改,没有什么可以防止引入任何类型的错误。