我已经看了这个答案,它说明了如何:
在新的html" target="_blank">内存模型下,当线程A写入易失性变量V,而线程B从V读取时,现在保证了在写入V时A可见的任何变量值对B可见。
因此,给出示例:
public class Main {
static int value = -1;
static volatile boolean read;
public static void main(String[] args) {
Thread a = new Thread(() -> {
value = 1;
read = true;
});
Thread b = new Thread(() -> {
while (!read);
System.out.println("Value: " + value);
});
a.start();
b.start();
}
}
value
尽管value
(仅read
)不易变性,但是否保证线程b看到(从-1到1)的更改?
如果是这样的话,给定一系列更改是为了使另一个线程可见,那么除了最后一个可变变量之外,是否要对其他任何变量进行更改有没有目的?
是的,value
保证对b 的更改是可见的。
JLS
17.4.4。同步命令说:
- 对易失性变量 v (第8.3.1.4节)的写 操作与 任何线程对 v 的所有后续读取进行 同步
(其中“后续”是根据同步顺序定义的)。
JLS
17.4.5。发生在命令之前:
可以通过 事前发生 关系来排序两个动作。如果一个动作 发生在 另一个动作 之前 ,则第一个动作对第二个动作可见,并在第二个动作 之前
排序。如果我们有两个动作 x 和 y ,我们写 hb(x,y) 表示 x发生在y之前 。
如果 x 和 y 是同一线程的动作,并且 x 按程序顺序位于 y 之前,则 hb(x,y) 。
有一个 之前发生 边缘从物体到该对象的终结器(§12.6)的开始的构造的端部。
如果一个动作 x与 后面的动作 y 同步 ,那么我们也有 hb(x,y) 。
如果 hb(x,y) 和 hb(y,z) ,则 hb(x,z) 。
项目符号1说是在value = 1
-之前发生的 read = true
。
项目符号3表示read = true
发生 这种 情况-之前!read
。
项目符号1说是在!read
-之前发生的 "Value: " + value
。
项目符号4说是 value = 1
在…之前发生的 "Value: " + value
。
问题内容: 假设我有两个线程在更新一个对象,一个线程在不同步的情况下从该对象读取。显然,这是运行条件。但是,我想知道变量本身是否只能部分写入。 我假设打印出的值也将是2或1。但是,我想知道变量是否可能设置为一半? 我以原语为例,但如果对象不同,我希望答案也适用于对象。 问题答案: 这取决于变量的类型。 s和s(Java中的两种64位类型)如果不是,则允许字眼翻译,而所有其他类型(包括引用)可能永远
我试图模拟餐饮哲学家的问题,但我很难想象它。当线程从等待()到吃()再到思考()时,它会改变一个名为state的变量来表示这一点。然而,在我的主线程中,它从未看到状态变量发生变化。它在绘制时调用状态的返回函数来改变哲学家的颜色。 有什么帮助吗? 以下是一些代码:状态更改 返回函数 调用返回函数
下面的代码片段使用多个线程,使用AtomicInteger计算到1亿。我有10个Writer线程来模拟写争用,还有一个Reader线程来模拟读争用。作者和读者还共享一个易变的布尔变量作为毒药。 但是,只有读线程可以退出,而写线程不能退出。尽管将变量声明为volatile,但为什么读线程不能看到更新的值? 附言:如果我把布尔值包在一个对象中,它就会工作。
问题内容: 我有一个测试用例,可以访问浏览器并对其进行处理。但是我需要以编程方式更改某些文本框的输入内容。我有8个字符串和一个布尔值,表示测试需要正确运行。问题是,您必须先通过ant和构建过程运行测试用例,然后才能实际运行它。我希望能够构建它,将其放在设备上,然后在我调用它时以某种方式将数据传递给设备。但是我不知道那是否可能。我目前唯一想到的选择是编写一个快速的Java程序,将其写入文件,更改变量
谁能告诉我。
我正在阅读JCIP,无法理解3.3.1中的以下语句, 对共享的易失性变量执行读-修改-写操作是安全的,只要可以确保仅从单个线程写入易失性变量。在本例中,您将修改限制在单个线程中,以防止出现争用情况,并且volatile变量的可见性保证确保其他线程看到最新的值。 即使挥发性变量只从单个线程写入,它怎么能不提高竞争条件?如果线程A在计数器为1时执行,线程B可以在计数器1写入内存之前进入,并获得的旧值1