этот код имеет проблему «поток может остановиться» о ссылочной безопасности потока - PullRequest
0 голосов
/ 30 марта 2019

этот код может печатать "light is null" навсегда? И нужно ли 'volatile' для украшения ссылки?

Я пытаюсь запустить код, поток может остановиться.я знаю, что если использовать булевый тип вместо Light, он должен использовать volatile。, но когда я использую ссылку, я не знаю.В большинстве программ, которые используют ссылки в нескольких потоках для общего доступа, я не использую volatile для декорации, кроме SingleTon example.but мы делаем это для выполнения компьютерных инструкций по порядку, а не для видимости в нескольких потоках.

public class Room {
    private Light light;

    public Light getLight() {
        return light;
    }

    public void setLight(Light light) {
        this.light = light;
    }

    Runnable work = new Runnable() {

        @Override
        public void run() {
            while (light == null) {
                System.out.println("light is null");
            }

        }
    };

    public void start() {
        new Thread(work).start();
    }

    public static void main(String[] args) throws InterruptedException { 
        Room room = new Room();
        room.start();
        Thread.sleep(3000);
        room.setLight(new Light());
        while (true) {

        }
    }
}

is the reference 'light' need 'volatile' to decorate
...