Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可能永远不会发生的重新排序_Java_Memory Model - Fatal编程技术网

Java 可能永远不会发生的重新排序

Java 可能永远不会发生的重新排序,java,memory-model,Java,Memory Model,在讨论中,我们得到了两个非常好的例子 我只想讨论第二个问题。为了方便起见,我在这里举了第二个例子: public int hashCode() { if (hash == 0 && count > 0) { //(1) int h = hash; int off = offset; char val[] = value; int len = count; for (int i = 0;

在讨论中,我们得到了两个非常好的例子

我只想讨论第二个问题。为了方便起见,我在这里举了第二个例子:

public int hashCode() {
    if (hash == 0 && count > 0) { //(1)
        int h = hash;
        int off = offset;
        char val[] = value;
        int len = count;

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }
        hash = h; //(2)
    }
    return hash; //(3)
}
public int hashCode(){
如果(hash==0&&count>0){//(1)
int h=散列;
int off=偏移量;
char val[]=值;
int len=计数;
对于(int i=0;i
根据happens before关系定义中的第一项:如果x和y是同一线程的动作,并且在程序顺序中x在y之前,那么hb(x,y),我们可以得到以下结论:

有血红蛋白((1)、(2))和血红蛋白((2)、(3)),因此有血红蛋白((1)、(3))

因为:

hash是一个共享变量

(1) ,(2),(3)是同一线程的所有动作

(1) 在程序顺序中位于(2)之前,(2)位于(3)之前

现在回到我的问题:如果(1)和(3)之间有一个before关系,那么(1)和(3)永远不应该被重新排序


我的解释有什么误解吗?您的意见如何?

对于由不同线程执行的(1)、(2)和(3)引发的操作,没有强加任何顺序;仅在订购前发生的事件将发生在同一线程提交的(1)、(2)、(3)三元组内,具体如下:

如果x和y是同一线程的动作,并且x在程序顺序中位于y之前,那么hb(x,y)


只要执行机器指令的线程不遵守与程序顺序不一致的顺序,任何执行都可能发生机器指令的重新排序。对于任何其他线程,它们可以按任何顺序观察操作(甚至根本不观察),因为从这些操作到其他线程的任何操作之前都不会发生任何事件。然而,您的示例仅包含一个书写,并且必须至少有两个书写才能赋予“无序”概念以意义。只有写操作具有可从其他线程观察到的效果。

您所声明的内容仅适用于特定线程。如果你有两个或更多的线程,你的断言是不正确的。@MarkoTopolnik你能将与答案相关的评论内容编辑到帖子中吗?这里的评论线程有点长,我觉得它包含了答案中应该包含的信息。提前谢谢。如果你对这个问题失去兴趣,那就没问题了。欢迎您随时回到这里或提出任何其他问题。