有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么打印时会从主内存获取值?

给出以下代码。当我取消对print语句的注释时,使用者从主存读取值(并检测到更改)。 当我对它进行评论时,没有检测到任何变化(当然,这两种假设都是非易失性的)

为什么?编译器在本例中决定不使用缓存是个好主意,这只是“随机”的吗

public class Counter {
    private /*volatile*/ int val;

    public int getVal() {
        return val;
    }

    public synchronized void increment() {
        this.val++;
    }
}

public class Producer extends Thread {
    private final Counter counter;

    public Producer(Counter counter) {
        this.counter = counter;
    }

    @Override
    public void run() {
        while (counter.getVal() < 5) {
            counter.increment();
            System.out.println("Producer: incrementing count to " + counter.getVal());

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                return;
            }
        }
        System.out.println("Producer: terminating");
    }
}

public class Consumer extends Thread {
    private final Counter counter;

    public Consumer(Counter counter) {
        this.counter = counter;
    }

    @Override
    public void run() {
        int localValue = -1;
        while (true) {
//            System.out.println("I see: " + counter.getVal());
            if (localValue != counter.getVal()) {
                System.out.println("Consumer: detected count change " + counter.getVal());
                localValue = counter.getVal();
            }
            if (counter.getVal() >= 5) {
                break;
            }
        }
        System.out.println("Consumer: terminating");
    }
}

共 (0) 个答案