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

Java内存模型中的先发生规则

南宫喜
2023-03-14
问题内容

我目前正在学习并发编程考试,不理解为什么该程序的输出为43。为什么x = y + 1以前执行t.start()?我还应该解释使用规则之前发生的情况。

如果我了解程序顺序规则(线程中的每个动作发生在该线程中的每个动作发生在程序顺序的后面)t.start()必须先执行,x = y + 1以便线程t复制变量x为1。

public class HappensBefore {

static int x = 0;
static int y = 42;

public static void main(String[] args) {
    x = 1;
    Thread t = new Thread() {
        public void run() {
            y = x;
            System.out.println(y);
        };
    };
    t.start();
    x = y + 1;
}

问题答案:

根据JMM:

在启动线程中的任何操作之前,都会在线程上调用start()。

如果x和y是同一线程的动作,并且x按程序顺序位于y之前,则hb(x,y)。

程序顺序的定义是这样的:

在每个线程t执行的所有线程间操作中,t的程序顺序是总顺序,该顺序反映了根据t的线程内语义执行这些操作的顺序。

线程间语义是JMM中定义明确的概念。这意味着每个线程在程序中执行的指令顺序必须保持不变,因为它是写在程序文本中的。

将所有这些应用于您的案例:

t.start(); hb x = y + 1; //程序顺序

t.start(); hb y = x;
//发生在此处指定的规则之前

如果没有额外的同步,我们不能说如何x = y + 1;y = x; 涉及彼此(从JMM的角度来看)。

如果您要回答问题“在我的情况下在运行时会发生什么?”。可以发生很多事情......看看这个asnwer。运行时可以执行JMM认为很重要的优化。

无论如何,如果您对内部结构感兴趣,可以查看这篇
文章

(可以避免内存障碍)。如您所见,在生成的程序集中,执行易失性读取时未应用任何内存屏障。我的意思是运行时间无论如何都可以优化…只要保留JMM规则…



 类似资料:
  • 规范了Java虚拟机与计算机内存是如何协调工作的,规定了一个线程如何及何时能看到其他线程修改过的共享变量,在必须时如何同步地访问共享变量,控制线程本地内容和共享内容之间的同步。 2. 同步八种操作 操作 定义 lock(锁定) unlock(解锁) read(读取) load(载入) use(使用) assign(赋值) store(存储) write(写入) 3. 同步规则 Read和Load之

  • 问题内容: 我想说明 先发生的 关系如何与 volatile 变量一起使用。让我们有以下变量: 和线程A: 和线程B: 根据Java内存模型(JMM),以下语句正确吗? 如果没有,正确的解释是什么? 总是在 发生之前 __仅在JMM中实际发生时才 发生- 在JMM中 __ 如果实际上发生在时间之前,则发生在JMM中-before -before (并且将可预测地分配) 否则,和之间的顺序不确定,并

  • 我想澄清发生前关系是如何与不稳定变量一起工作的。让我们有以下变量: 和线程A: 和线程B: 根据Java内存模型(JMM),以下语句是否正确?如果不是,正确的解释是什么? 总是发生-之前 在JMM中发生在之前,只有当它实际发生在时间之前 在JMM中发生在之前(并且将被可预测地分配)如果实际发生在

  • 本文向大家介绍JAVA内存模型和Happens-Before规则知识点讲解,包括了JAVA内存模型和Happens-Before规则知识点讲解的使用技巧和注意事项,需要的朋友参考一下 我们在本篇内容里聊一聊JAVA的内存模型和Happens-Before规则。 JAVA内存模型 这里的JAVA内存模型指的不是我们JVM专栏中提到的内存分布模型,而是针对并发编程的,小伙伴们不要混淆概念了。 我们已经

  • 使用包含Scala和Akka在内的Typesafe平台的主要好处是它简化了并发软件的编写过程。本文将讨论Typesafe平台,尤其是Akka是如何在并发应用中访问共享内存的。 Java内存模型 在Java 5之前,Java内存模型(JMM)定义是有问题的。当多个线程访问共享内存时很可能得到各种奇怪的结果,例如: 一个线程看不到其它线程所写入的值:可见性问题 由于指令没有按期望的顺序执行,一个线程观

  • 在了解什么是 Java 内存模型之前,先了解一下为什么要提出 Java 内存模型。 之前提到过并发编程有三大问题 CPU 缓存,在多核 CPU 的情况下,带来了可见性问题 操作系统对当前执行线程的切换,带来了原子性问题 译器指令重排优化,带来了有序性问题 为了解决并发编程的三大问题,提出了 JSR-133,新的 Java 内存模型,JDK 5 开始使用。 简单总结下 Java 内存模型是 JVM