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;
}
Run Code Online (Sandbox Code Playgroud)
假设主线程经常调用updateObj()子线程调用getSomething()方法.
难道我以前需要一个锁(或方法声明为synchronized)myObj = newObj;和int something = myObj.getSomething();
有人认为我不需要锁定,因为在Java中,赋值操作(例如myObj = newObj;)是原子的.但我不明白的是,myObj.getSomething();这不是原子操作,而是O(n ^ 2)所以我认为仍然需要锁定.它是否正确?
提前致谢.
是的,你需要在这里加锁。因为我可以看到不同的函数是由不同的线程调用的,并且您正在方法myObj中使用getSomething()。现在假设当您的子线程正在执行getSomething()并且同时您的主线程发生更改myObj时,您的程序将成为竞争条件的受害者,并且您可能无法获得所需的输出。但这取决于您编写的整体程序。希望这可以帮助
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |