Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,有没有一种直接生成属性的方法;同步的;?_Java_Multithreading - Fatal编程技术网

在Java中,有没有一种直接生成属性的方法;同步的;?

在Java中,有没有一种直接生成属性的方法;同步的;?,java,multithreading,Java,Multithreading,如果我有一个属性为private int I的对象,我知道我可以让getter和setter方法像这样“同步”。。。但是,由于以后可能会添加另一个方法,直接访问/更改i,有没有办法声明i是一个“synchronized”属性 public class SharedObject { int i; synchronized public int getI() { return i; } synchronized public void setI(int i) {

如果我有一个属性为
private int I的对象,我知道我可以让getter和setter方法像这样“同步”。。。但是,由于以后可能会添加另一个方法,直接访问/更改
i
,有没有办法声明
i
是一个“synchronized”属性

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" !!
  }

}
公共类SharedObject{
int i;
同步公共int getI(){
返回i;
}
同步的公共void setI(int i){
这个。i=i;
}

public void badMethod(){无法将成员变量声明为
synchronized

但是,如果
i
表示对象的独立状态——换句话说,如果
i
可以独立于其他状态进行设置和获取,并且您不依赖
i
的getter和setter的同步来序列化与其他
synchronized
方法的访问,那么您可以声明
i
作为


您可以考虑将所有并发关键代码移到它自己的类(甚至声明类<代码>最终< /代码>),这可能会使意图更加清晰,但如果是“健忘程序员”可以对源代码进行更改,没有什么可以防止引入任何类型的错误。

有,但这是否与您“等效”取决于您正试图实现的目标。什么并发问题您的目标是解决这个问题吗?您可以使用原子引用类型。@MattBall只是想更好地理解线程。在一次面试中,我被问到“是否应该在布尔属性周围放置一个同步块”,我不知道--我说“是”,但他说没有必要,因为更改布尔值是一个原子操作。所以我想知道除了使getter/setter同步之外,是否还有其他方法可以“同步”属性。当他说“在布尔值周围放置同步块”时,他的意思是“同步”吗getter和setter?我不认为将
synchronized
放在getter和setter上会取得太大的效果-在任何需要
AtomicInteger
的情况下,它们都不会帮到你。我还认为面试官弄错了-像
setFoo(!getFoo())这样的一行
其中
Foo
是布尔值肯定不是原子的,在类内
Foo=!Foo
也不是。我不会。我会向他解释
同步的
块做什么,以及
易失性的
意味着什么,并让他从中看出(a)这个问题没有意义,以及(b)我比他更了解这件事。
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'
  }

}