Можно ли прочитать устаревшее значение энергонезависимой переменной во время чтения из другого потока? - PullRequest
1 голос
/ 04 мая 2020

У меня есть основной поток, который создает объект с энергонезависимой переменной, а затем в этом потоке я изменяю значение переменной и помещаю объект в BlockingQueue.
Во втором потоке я жду, пока объект не станет доступен и прочитайте объект и его переменную.

Пример кода:

public class ReadCheck {

    static BlockingQueue<A> queue = new LinkedBlockingQueue<>();

    public static class A {

        public int a;

        public A(int a) {
            this.a = a;
        }

    }

    public static void main(String[] args) throws InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        A a = queue.take();
                        if (a.a != 20) {
                            System.out.println(a.a);
                        }
                    } catch (InterruptedException e) {
                    }
                }
            }
        }).start();


        while (true) {
            A a = new A(10);
            a.a = 20;
            queue.offer(a);
        }
    }
}

Во время выполнения примера я никогда не видел, чтобы эта переменная равнялась 10 (это всегда 20).
Это Возможно ли, что я прочитал устаревшее значение (10) переменной во втором потоке в таком случае?
Является ли этот пример кода поток безопасным?

1 Ответ

3 голосов
/ 04 мая 2020

Нет, вы не можете прочитать устаревшие значения; да, это будет потокобезопасным.

Очередь блокировки гарантирует , что предложение происходит до получения, поэтому запись в значение в A.a произойдет до того, как вы его прочитаете.

Как и в случае других одновременных коллекций, действия в потоке перед помещением объекта в BlockingQueue выполняются до выполнения действий после доступа или удаления этого элемента из BlockingQueue в другом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...