小编use*_*869的帖子

Java内存模型中本地最终变量的语义?

以下代码有时会在我的Windows-PC和Mac上打印"valueWrapper.isZero()",它们都在服务器模式下运行它们的JVM.确定发生这种情况是因为值字段在ValueWrapper类中不是最终的,因此某些线程可能会看到过时值0.

public class ConcurrencyApp {
    private final Random rand = new Random(System.currentTimeMillis());
    private ValueWrapper valueWrapper;

    private static class ValueWrapper {
       private int value;

        public ValueWrapper(int value) {
            this.value = value;
        }

        public boolean isZero() {
            return value == 0;
        }
    }

    private void go() {
        while (true) {
            valueWrapper = new ValueWrapper(randomInt(10, 1024));
            Thread thread = new Thread(new Runnable() {

                @Override
                public void run() {
                    if (valueWrapper.isZero()) {
                        System.out.println("valueWrapper.isZero()");
                    }
                }
            });
            thread.start();
        }
    }

    private int randomInt(int min, int …
Run Code Online (Sandbox Code Playgroud)

java concurrency final

6
推荐指数
2
解决办法
268
查看次数

标签 统计

concurrency ×1

final ×1

java ×1