尽管我没有找到这个问题,但这似乎是一个很常见的问题。假设我有这段代码:



public class MyClass {
    private AnotherClass mField;

    public void changeOne(AnotherClass newOne) {
        // <...> lines of code here
        synchronized (mField) {
            mField = newOne;
        }
        // <...> lines of code here

    }

    public void changeTwo(AnotherClass newTwo) {
        // <...> lines of code here
        mField = newTwo;
        // <...> lines of code here
    }
}


假设changeOne()changeTwo()是从不同的线程调用的。在changeOne()中具有一个同步块足以保护mField不受changeTwo()的更改是否足够?还是我需要将mField更改为synchronized块的每个位置显式包装? (请留下同步方法和其他方法)。

最佳答案

您需要使用同步块(或)同步方法来显式同步对mField的所有修改。否则,一个以上的线程可以通过一次执行changeTwo来更改mField

编辑:正如特德·霍普(Tedd Hopp)所建议的,如果变量不是非易失性读取,还需要同步并锁定,则您得到的应该是同一对象。

09-09 23:04