是否可以保证处理后续网络请求的线程看到在先前请求期间写入的易失性变量的值?

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

我有关于Java内存模型的理论问题。假设我在下面的类中有一个带有这两个请求处理程序的服务器:

class MyHandlers {
  volatile int someFlag = 0;

  String handleFirstRequest() {
    someFlag = 1;
    return "Hello!";
  }

  String handleSecondRequest() {
    return "value of someFlag: " + someFlag;
  }
}

我也有一个客户。我的客户端发送了一个触发执行handleFirstRequest的网络请求。客户端等待,直到请求完成。一旦第一个请求完成,客户端将发送第二个触发handleSecondRequest的请求。

问题: Java内存模型如何防止对第二个请求的响应为"value of someFlag: 0"

注意:我了解,实际上,处理第二个响应的线程将始终将someFlag视为1。

如果我正确地读取了JMM,则存在一个总顺序的同步顺序,该顺序将对示例中的易失性读取和易失性写入(someFlag = 1)进行排序。如果读取在写入之后进行,则读取将看到写入。是否有可能在读取之后进行写入?在这种情况下,写入与读取不同步,并且写入与读取之间没有任何先发生的关系。这将导致线程处理第二个请求,以将someFlag视为0。我的理解哪里出错了?

java multithreading volatile
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.