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你能将与答案相关的评论内容编辑到帖子中吗?这里的评论线程有点长,我觉得它包含了答案中应该包含的信息。提前谢谢。如果你对这个问题失去兴趣,那就没问题了。欢迎您随时回到这里或提出任何其他问题。