在Java中有没有办法直接使属性“同步”?

时间:2014-04-23 00:15:51

标签: java multithreading

如果我有一个具有属性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'
  }

}

1 个答案:

答案 0 :(得分:1)

无法将成员变量声明为synchronized

但是,如果i表示对象的独立状态 - 换句话说,如果i可以设置并独立于其他状态,并且您不依赖于同步i的getter和setter可以使用其他synchronized方法序列化访问权限,然后您可以将i声明为volatile

您可以考虑将所有并发关键代码移动到它自己的类(甚至声明类final),这可能会使意图更清晰。但如果一个健忘的程序员&#34;可以对源代码进行更改,没有什么可以防止引入任何类型的错误。