当前位置: 首页 > 面试题库 >

如果线程B希望看到线程A所做的更改,那么最后更改只能是volatile变量而不是全部变量吗?

王飞虎
2023-03-14
问题内容

我已经看了这个答案,它说明了如何:

在新的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。发生在命令之前:

可以通过 事前发生 关系来排序两个动作。如果一个动作 发生在 另一个动作 之前 ,则第一个动作对第二个动作可见,并在第二个动作 之前
排序。

如果我们有两个动作 xy ,我们写 hb(x,y) 表示 x发生在y之前

  • 如果 xy 是同一线程的动作,并且 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