java - 这段代码是否安全基于发生优先原则
问题描述
示例如下:我有两个服务,分别称为A,B。服务A将写入数据库,然后调用服务B的API。然后服务B将消费服务A已写入的数据库。
代码示例如下:
//service A
public void writeDbAndNotifyServiceB() {
// will need much time to write database
for (int i = 0; i < 100000000; i++) {
// write db A
}
// ddb write finished, call serviceB
B.readDbWhichServiceAWrite();
}
// API of service B
public void readDbWhichServiceAWrite() {
//read db A
}
在我了解了有关指令重新排序的一些知识后,我担心是否有可能
B.readDbWhichServiceAWrite();
在写入数据库操作之前执行,然后服务 B 无法从数据库中读取任何内容。
如果这种情况可能存在,正确的解决方案是什么?
如果您能提供任何建议,我将不胜感激。
解决方案
这是安全的。来自 jsr133:http ://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf
Happens-Before 关系 两个动作可以通过happens-before 关系排序。如果一个动作发生在另一个动作之前,那么第一个动作对第二个动作可见并在第二个动作之前排序。
线程中的每个动作都发生在该线程中的每个后续动作之前
推荐阅读
- android - 从另一个活动返回后,Bundle 为空
- swift - 将stackview的大小修复为所有屏幕大小
- python - Python:不同文件中的数字总和
- javascript - 如何在 React 中获取状态下数组的长度?
- python-3.x - 如何通过连接操作获取表名
- c# - 将多对多转换为父子关系
- android - 为 TextView 设置自动调整大小模式无效
- android - 如何在 Android Studio 上调试预构建共享库?
- c# - 如何从模式堆栈中删除特定页面?
- entity-framework - 已经存在的数据库的数据库中已经有一个名为“xxx”的对象