我有关于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。我的理解哪里出错了?