在Java语言规范的第17章中,有一节解释了为什么"在一致性不充分之前发生".这是一个例子:
At first, x = y = 0
Thread 1 | Thread 2
r1 = x; | r2 = y;
if (r1 != 0) y = 1; | if (r2 != 0) x = 1;
Run Code Online (Sandbox Code Playgroud)
这是一个可能的执行跟踪:
r1 = x; // sees write of x = 1
y = 1;
r2 = y; // sees write of y = 1
x = 1;
Run Code Online (Sandbox Code Playgroud)
怎么会发生这种情况?令我困惑的是,当第一个动作看到x = 1时,是不是意味着条件r2!= 0变为真,因此y被分配给1?但按顺序,在r1 = x之后,y = 1.我在哪里弄错了理解这个例子?我该如何正确理解这个例子呢?
我正在尝试理解Java 发生 - 在订单概念之前,有一些东西看起来很混乱.据我所知,之前发生的只是行动集上的一个订单,并没有提供有关实时执行订单的任何保证.实际上(强调我的):
应该注意的是,两个动作之间存在的先发生关系并不一定意味着它们必须在实现中以该顺序发生.如果重新排序产生的 结果与合法执行一致,则不是非法的.
因此,所有它说的是,如果有两个动作w(写)和r(读),使得HB(W,R) ,较r 可能实际发生之前,w在执行,但不能保证它会的.w读取也会观察到写入r.
我如何确定在运行时随后执行两个操作?例如:
public volatile int v;
public int c;
Run Code Online (Sandbox Code Playgroud)
操作:
Thread A
v = 3; //w
Thread B
c = v; //r
Run Code Online (Sandbox Code Playgroud)
这里我们有,hb(w, r)但这并不意味着在分配后c会包含价值3.如何强制执行c3?同步订单是否提供此类保证?
我经常碰到“线程安全”这两个关键术语,想知道这意味着什么。例如,在Firebase或Realm中,某些对象被视为“线程安全”。线程安全的东西到底意味着什么?
我有一个非常特别的问题,我找不到答案。
正如我们所知,在synchronized块的入口处,线程会重新读取其范围内的所有共享(非本地)变量。某些底层架构的示例:如果线程 A 更新 RAM 中的对象状态,线程 B 进入同步块将看到更改。类似的事情发生在退出synchronized块时:线程将其范围内的所有内容刷新到 RAM,以便其他线程可以看到它。这些是基本的 JVM 可见性保证,并且存在发生之前的规则来强制执行它。
但是,从语义上讲,代码使用wait()或notify()也执行所有这些操作并不是很清楚:毕竟它没有明确地进入或离开synchronized块。
这些问题是:
wait()入口处对其他线程的更改可见?wait()休假时所做更改的可见性?notify()?java multithreading synchronized java-memory-model happens-before