为什么volatile在java中像ArrayList这样的容器?

问题描述 投票:1回答:1

volatile在重新分配变量时工作。但是为什么volatile工作时ArrayList改变如下?

package io.github.baijifeilong.thread;

import io.vavr.control.Try;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

public class VolatileApp3 {

    private static volatile List<Integer> list = new ArrayList<>();


    public static void main(String[] args) {
        new Thread(() -> IntStream.rangeClosed(1, 10).forEach($ -> {
            Try.run(() -> TimeUnit.SECONDS.sleep(1));
            System.out.printf("Appending %d => ", $);
            list.add($);
            System.out.println(list);
        })).start();

        new Thread(() -> {
            while (list.size() < 5) {
//                Try.run(() -> TimeUnit.SECONDS.sleep(0));
            }
            System.out.println("List size >= 5 now");
        }).start();
    }
}

控制台结果是:

Appending 1 => [1]
Appending 2 => [1, 2]
Appending 3 => [1, 2, 3]
Appending 4 => [1, 2, 3, 4]
Appending 5 => [1, 2, 3, 4, 5]
List size >= 5 now
Appending 6 => [1, 2, 3, 4, 5, 6]
Appending 7 => [1, 2, 3, 4, 5, 6, 7]
Appending 8 => [1, 2, 3, 4, 5, 6, 7, 8]
Appending 9 => [1, 2, 3, 4, 5, 6, 7, 8, 9]
Appending 10 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
java multithreading volatile
1个回答
0
投票

列表中的非易失性写入可由编译器和底层硬件自由重新排序。不确定JVM如何重新排序非易失性写入,但如果您正在使用x86,则由于内存模型是TSO,因此总是在内核之间进行写入。

© www.soinside.com 2019 - 2024. All rights reserved.