我一直在努力了解什么VarHandle::setOpaque
和真正VarHandle::getOpaque
在做什么。到目前为止这并不容易 - 我认为我得到了一些东西(但不会在问题本身中提出它们,而不是混淆水域),但总的来说,这对我来说充其量是错误的。
文档:
返回按程序顺序访问的变量的值...
我的理解是,如果我有:
int xx = x; // read x
int yy = y; // read y
这些读取可以重新排序。另一方面,如果我有:
// simplified code, does not compile, but reads happen on the same "this" for example
int xx = VarHandle_X.getOpaque(x);
int yy = VarHandle_Y.getOpaque(y);
这次不能再下单了?这就是“程序顺序”的意思吗?我们是否在谈论在这里插入障碍以禁止重新排序?如果是这样,由于这是两个负载,是否会实现相同的效果?通过:
int xx = x;
VarHandle.loadLoadFence()
int yy = y;
但它变得更加棘手:
...但不能保证相对于其他线程的内存排序效果。
我想不出一个例子来假装我理解这部分。
在我看来,这个文档是针对那些确切知道自己在做什么的人(我绝对不是)......所以有人可以在这里阐明一下吗?