我需要锁吗?

use*_*799 5 java concurrency

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)所以我认为仍然需要锁定.它是否正确?

提前致谢.

San*_*ari 0

是的,你需要在这里加锁。因为我可以看到不同的函数是由不同的线程调用的,并且您正在方法myObj中使用getSomething()。现在假设当您的子线程正在执行getSomething()并且同时您的主线程发生更改myObj时,您的程序将成为竞争条件的受害者,并且您可能无法获得所需的输出。但这取决于您编写的整体程序。希望这可以帮助