为什么这段代码不是线程安全的?

blu*_*sky 9 java scjp

在下面的代码片段中,将doThings()方法声明为static将使类成为线程安全的.原因是如果启动了多个TestSeven线程,并且由于x是静态变量,可能会出现竞争条件?

public class TestSeven extends Thread{

    private static int x;

    public synchronized void doThings(){
        int current = x;
        current++;
        x = current;
    }

    public void run(){
        doThings();
    }

    public static void main(String args[]){
        TestSeven t = new TestSeven();
        Thread thread = new Thread(t);
        thread.start();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 16

对,就是这样.该synchronized性质doThings只能从被称为由多个线程同时停止它在相同的实例.变量x全局基础上共享,而不是基于每个实例共享,因此它是不安全的.

在现实世界中,将它想象成一个带有几扇门的浴室 - 有人可以打开一扇门然后将其锁上,但这并不能阻止其他人通过不同的门进入......