在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'
}
}