首页 > 解决方案 > 这段代码是否安全基于发生优先原则

问题描述

示例如下:我有两个服务,分别称为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 无法从数据库中读取任何内容。

如果这种情况可能存在,正确的解决方案是什么?

如果您能提供任何建议,我将不胜感激。

标签: java

解决方案


这是安全的。来自 jsr133:http ://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf

Happens-Before 关系 两个动作可以通过happens-before 关系排序。如果一个动作发生在另一个动作之前,那么第一个动作对第二个动作可见并在第二个动作之前排序。

线程中的每个动作都发生在该线程中的每个后续动作之前


推荐阅读