MyObject myObj ...
public void updateObj(){
MyObject newObj = getNewMyObject();
myObj = newObj;
}
public int getSomething(){
//O(n^2) operation performed in getSomething method
int something = myObj.getSomething();
return something;
}
假设主线程定期调用updateObj()
和子线程很频繁地调用getSomething()
方法。我需要锁吗?
我需要一个锁(或声明为synchronized方法)之前myObj = newObj;
和int something = myObj.getSomething();
有人认为我不需要这里的锁,因为在Java中,赋值操作(例如myObj = newObj;
)是原子。但我没有得到的是myObj.getSomething();
这不是一个原子操作,但它的O(n^2),所以我认为仍然需要一个锁定。它是否正确?
在此先感谢。
'将方法声明为synchronized'将不起作用。由于你没有改变myObj,'getSomething'可以使用旧版本还是新版本,如果是,那么非同步应该可以。 –
如果可以使用'myObj'的旧值,则不需要锁定。但是你更新了它是有原因的,不是吗? – cHao
我同意@cHao。但是,如果您可以概述getSomething()的相关行,那么我们可以给出明确的答案。 – RRM