我刷新了缓存中保存的脏数据

发布时间:2025-06-24 20:14:52  作者:北方职教升学中心  阅读量:736


StoreLoad Barriers是“全能”的屏障,它还具有前三个屏障的效果。JSR-使用133内存模型 happens-before的概念阐述了操作之间的内存可见性。a=1;//A1x=b;//A2。Java程序员,happens-before规则简单易懂c;为了理解,,如果线程A和线程B之间需要通信,必须经历以下两个步骤:
 1)、将线程B读取到内存中。

N。并将其刷新到内存中(A3、

[1]Java中堆内存主要用于存储实例域、

禁止对特定类型的处理器重进行排序。我刷新了缓存中保存的脏数据,
N。具体原因:上面提到的,处理器上的缓存区只能在其处理器中看到。Y。Store-Store。StoreLoad Barriers将使屏障成为所有内存访问指令(存储和装载指令)完成后,执行屏障后的内存访问指令。,可以通过程序获得 x=y=0的结果。Y。IA64。

[1]并发中常见的两个问题:如何通信线程,B3),当这个时序执行时,整个通信过程是完全透明的。

StoreLoad Barriers。Y。Store(写)-Load(阅读)
数据依赖。

优质博文:IT-BLOG-CN。局部变量(Local Variables),方法定义参数和异常处理器参数;Exception Handler Parameters)#xff00不会在线程之间共享c;它们不会有内存可见性问题,也不受内存模型的影响。

Y。
运行结果。happens-before的定义非常微妙c;后面具体说明 happens-为什么before要这样定义?happens-before的定义非常微妙c;后面具体说明 happens-为什么before要这样定义?

一个 happens-before规则对应于一个或多个编译器和处理器重排序规则。

三、[4]传递:

如果A happens-before B,且B happens-before C,那么A happens-before C。

N。这些重排序可能会导致多线程序的内存可见性问题。如果没有数据依赖性,处理器可以改变语句对应机器指令的执行顺序。LoadStore Barriers。b=2;//B1y=a;//B2。Y。ProcessB。N。

确保Store1中的数据可见于其他处理器(刷新到内存)优于Load2和所有后续加载指令。[2]监视器锁定规则:
解锁一个锁,happens-before随后锁上了这个锁。静态域和数组元素)。静态域和数组元素等,共享#xff08;“共享变量”是指实例域、

现在的处理器使用写作。Y。N。虽然处理器A执行内存操作的顺序是:A1——>A2,但A2的实际内存操作顺序——>A1。在JMM中�如果一个操作执行的结果需要看到另一个操作,这两个操作之间必须存在 happens-before关系。LoadLoad Barriers。这里的“同”字应该是指协同、从源代码到指令序列的重排序。重新排序内存系统。本地内存是 JMM的抽象概念,并非真实存在。

假设处理器A 和处理器B 内存访问࿰按程序顺序并行执行c;最终可能会得到 x=y=0的结果。
 2)、确保Load1装载数据优先装载Load2和所有后续装载指令。[注意]:

有两个操作 happens-before关系,这并不意味着前一个操作必须在后一个操作之前执行!happens-before只需要前一个操作执行结果)后一个操作可见󿀌并且前一个操作按顺序排列在第二个操作之前。StoreStore Barriers。,这两个步骤本质上是线程A向线程B发送信息,此外,重新排序编译器优化。并发编程模型的分类。B2),最终,指令示例。JMM控制主内存与每个线程的本地内存之间的交互,为Java程序员提供内存可见性保证。

并发编程模型的两个关键问题。如何同步线程。现在大多数处理器都支持屏障(不一定支持其他类型的屏障),支持屏障开支通常非常昂贵c;因为当前的处理器通常需要将所有的数据刷新到内存(Buffer Fully Fulsh)。编译器󿼌JMM的编译器重排序规则将禁止特定类型的编译器重排序(并非所有编译器重排序都应禁止)。N。N。Y。,Java 线程之间的通信总是隐藏的,对程序员来说,,可以理解为协同步调,按照预定的顺序运行。
缓冲区。Store1; StoreStore; Store2。此时处理器A 内存操作顺序被重新排序(相同的处理器B)
[3]这里的关键是,因为写缓存区只能看到自己的处理器,因此,

▶ 常见处理器允许的重排序列表:(N:意味着不允许重新排序)处理器/规则。
 3)、写缓冲区可以保证指令流水线运行,可以有效避免因处理器停止等待数据写入内存而造成的延迟。
N。
代码。它避免了程序员 学习复杂的重排序规则和JMM提供的内存可见性保证的具体实现方法。在新闻传输的并发模型中,因为消息必须在收到消息之前发送。SPARC-TSO。happens-before 简介。;
[2]在共享内存的并发模型中,线程共享程序的公共状态,隐式通信是通过写入-阅读内存中的公共数据进行的。因此,
Y。合作,

五、
程序员密切相关 happens-before的规则如下a;[1]程序顺序规则:
每个操作在一个线程中,happens-本线程中before的任何后续操作。内存屏障指令。与。在新闻传输的并发模型中,如果没有公共状态󿀌通信࿱必须在线程之间发送信息b;
【3】。现代处理器采用指令级并行技术(Instruction-Level Parallelism,ILP)多个指令将重叠执行。3属于处理器重排序。

Y。寄存器等硬件和编译器的优化。如果编写多线程序,
确保Load1数据装载优先于Store2和所有后续存储指令刷新到内存。在共享内存并发模型中,同步是显式的。从抽象的角度来看,写缓存区、Store1; StoreLoad; Load2。在不改变单线程序语义的前提下,这两个操作可以在同一个线程中,也可以在不同的线程之间。编译器,语句的性质顺序可以重新安排。
【2】Java 线程之间的通信由 Java内存模型(JMM)控制,JMM决定何时将一个线程写入共享变量到另一个线程。[3]volatile变量规则:
写一个volatile域,happens-before在任何后续阅读这个volatile域。
Y。处理器执行内存操作的顺序可能与内存的实际操作执行顺序不一致。
[2]从内存操作的实际顺序来看,直到处理器A执行A3刷新自己的写作缓存区,写作操作A1才算真正执行。A执行取决于B的某个结果,于是停下来,示意B操作󿀌B执行结束后,

在执行程序时,为了提高性能�编译器(javac:将 java源程序编译成中间代码字节码文件;而且处理器经常对指令进行重新排序。JMM 将内存屏障指令分为4类:

屏障类型。可以理解为线程A和B配合󿀌在一定程度上,本地内存是 JMM的抽象概念,不真实。同时,缓冲区࿰通过批处理刷新c;多次写作操作与#xff0合并写作缓存器中的内存地址相同c;减少对内存总线的占用。Load1; LoadSotre; Store2。 Java程序员不了解线程之间隐藏通信的工作机制,很可能会遇到各种奇怪的内存可见性问题;

Java内存模型的抽象结构。从 Java源代码到最终实际执行的指令序列,将分别经历以下重排序:

[1]上述1属于编译器重排序,2、

说明。常见的处理器是允许的 Store-Load重排序,常见的处理器不允许数据依赖的操作重排序。PowerPC。临时保存写入内存的数据,因为处理器的处理速度远远大于 IO处理速度。例如栗子:

示例列/处理器。为了保证内存的可见性�在生成指令序列的适当位置插入Java编译器。,JMM定义了线程与主内存的抽象关系:主内存(存储线程之间的共享变量;Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),该线程的读写共享变量副本存储在本地内存中。N。在命令编程中,线程之间有两种通信机制:内存共享和信息传递。
处理器运行执行后的结果:x=y=0。

[1]处理器A在这里 和处理器B 共享变量可以同时写入自己的缓冲区(A1、
【2】JMM 属于语言级的内存模型,它确保在不同的编译器和处理器平台上,通过禁止特定类型的编译器重新排序和处理器重新排序,为程序员提供一致的内存可见性保证。同步是隐式的;
【4】Java 并发采用的是。

Load-Store。
总的来说,而不是一起。线程A刷新本地内存A中更新的共享变量到主内存。它涵盖了缓存、
X86。。
 2)、
确保Store1数据对其他处理器可见(内存刷新)优先存储Store2和所有后续存储指令。在线程A之前更新的共享变量之前,处理器排序,JMM的处理器重排序规则将需要 Java编译器在生成指令序列时,插入特定类型的内存屏障(Memory Barriers,Inter称之为Memory Fence)指令,特定类型的处理器重排序禁止通过内存屏障指令进行。ProcessA。虽然写缓存区有这么多好处,但是每个处理器上的写作缓冲区,它所在的处理器只能看到,这一特性将对内存操作的执行产生重要影响:处理器读写内存的执行顺序,不一定符合内存实际发生的阅读/写作顺序。协助、结果将给A,A继续操作。指令集并行重排序。
[2]从内存操作的实际顺序来看,直到处理器A执行A3刷新自己的写作缓存区,写操作A1才算真正执行。
A=初始状态;b=0。由于处理器使用缓存和阅读/写缓冲区,这使得加载和存储操作看起来像是在混乱的顺序中进行的。Load-Load。Java内存模型抽象示意图如下:

从上图来看,同步是指控制不同线程间操作相对顺序的机制。

【2】JMM 属于语言级的内存模型,它确保在不同的编译器和处理器平台上,禁止特定类型的编译器重排序和处理器重排序,为程序员提供一致的内存可见性保证。

N。。重排序分为三种:
 1)、共享内存模型。
Load1; LoadLoad; Load2。Sparc-TSO 和 X86具有相对较强的处理器内存模型,只允许对写-阅读操作重新排序#xff08;因为它们都使用写缓冲区)。通信是指线程之间交换信息的机制。由于当前处理器支持编写缓存,所以现在的处理器都支持写-读操作的重排序。B1),然后从共享内存中读取另一个共享变量(A2、可以看出,通信过程必须通过主内存。