Как работает поле getfield инструкции JVM?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как работает поле getfield инструкции JVM?

Сообщение Anonymous »

Поток A выполняет getfield Stop.flag, и его значение равно false. В определенный момент другой поток изменяет Stop.flag на true, но поток A продолжает получать false при чтении Stop.flag.
Я не понимаю. В соответствии с протоколом CPU MESI, даже если последнее значение не считывается из памяти, поток A все равно должен иметь возможность прочитать true из кэша с поддержкой MESI. Возможно ли, что getfield не читает из кэша ЦП?
package org.example;

import java.util.concurrent.TimeUnit;

public class TestVolatile2 {
public static class Stop {
boolean flag = false;
}

public static void main(String[] args) {
final Stop stop = new Stop();
// Thread-A
new Thread("Thread A") {
@Override
public void run() {
Stop s = stop;
while (!s.flag) { // getfield Stop.flag, but always false. even getfield from cpu caches, but msei sync true. why? getfield always false
}
System.out.println(Thread.currentThread() + " stopped");
}
}.start();

// Thread-main
try {
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread() + " after 1 seconds");
} catch (InterruptedException e) {
e.printStackTrace();
}
stop.flag = true;
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... field-work
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»