- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这是关于不稳定的搭载。目的:我想达到一个轻量级的变量可见性。 a_b_c 的一致性并不重要。我有一堆 var,我不想让它们都不稳定。
这段代码是线程安全的吗?
class A {
public int a, b, c;
volatile int sync;
public void setup() {
a = 2;
b = 3;
c = 4;
}
public void sync() {
sync++;
}
}
final static A aaa = new A();
Thread0:
aaa.setup();
end
Thread1:
for(;;) {aaa.sync(); logic with aaa.a, aaa.b, aaa.c}
Thread2:
for(;;) {aaa.sync(); logic with aaa.a, aaa.b, aaa.c}
最佳答案
Java 内存模型定义了 happens-before 关系,它具有以下属性(以及其他属性):
这两个属性连同 happens-before 关系的传递性暗示了 OP 以下列方式寻求的可见性保证:
a
在线程 1 中发生之前写入 sync
调用sync()
在线程 1 中(程序顺序规则)。sync
调用sync()
在线程 1 中发生之前读取到 sync
调用sync
在线程 2( volatile 变量规则)中。sync
的阅读调用sync()
在线程 2 happens-before 中读取 a
在线程 2 中(程序顺序规则)。这意味着问题的答案是肯定的,即调用 sync()
在线程 1 和 2 的每次迭代中确保对 a
的更改可见, b
和 c
到其他线程。请注意,这仅确保可见性。不存在互斥保证,因此所有不变量都绑定(bind) a
, b
和 c
可能会被违反。
另见 Java theory and practice: Fixing the Java Memory Model, Part 2 .特别是“波动的新保证”部分,它说
Under the new memory model, when thread A writes to a volatile variable V, and thread B reads from V, any variable values that were visible to A at the time that V was written are guaranteed now to be visible to B.
关于java - 易变的背负式。这足以提高知名度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8769570/
Notability 和其他笔记应用程序具有此“缩放框”功能,您可以在底部的放大框中绘图。用户还可以拖动顶部的框来更改他们想要在底部放大的内容。我已经尝试了所有我能想到的在我的应用程序中添加此功能的方
我是一名优秀的程序员,十分优秀!