同步方法是否对此进行锁定

use*_*726 1 java thread-safety

我正在阅读一本Java书,并发现了以下问题.

在下面的代码中,类线程是否安全?

public class Queen   
{
    public int x;
    public synchronized int getX()
    {
        return x;
    }
    public synchronized void setX(int x)
    {
        this.x = x;
    }
    public static void main(String args[]) 
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我的回答是肯定的,因为只有两个方法都是同步的,所以当其中一个方法正在运行时,它会锁定对象,而另一个方法无法运行.

但是,官方答案是NO,并且解释是变量int x是public,并且可以由线程修改,而另一个线程在其中一个同步方法中.那可能吗??同步方法是否在此处保留线程,这意味着该对象中的所有内容都包含公共变量?

Ale*_*ing 7

synchronized关键字所做的全部操作都会自动阻止synchronized对单个对象实例上的方法进行多次调用.这意味着无论何时调用synchronized方法,都必须在任何其他同步方法可以在同一实例上执行之前退出.

但是,直接字段访问不会受到Java中任何形式的锁定的影响,因此公共字段使此类非常不安全.