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,并且可以由线程修改,而另一个线程在其中一个同步方法中.那可能吗??同步方法是否在此处保留线程,这意味着该对象中的所有内容都包含公共变量?
synchronized关键字所做的全部操作都会自动阻止synchronized对单个对象实例上的方法进行多次调用.这意味着无论何时调用synchronized方法,都必须在任何其他同步方法可以在同一实例上执行之前退出.
但是,直接字段访问不会受到Java中任何形式的锁定的影响,因此公共字段使此类非常不安全.