From a4fb6dcd803c5e27ecb5dce77cae16a80b905768 Mon Sep 17 00:00:00 2001 From: WindLY <129519726+WindLYLY@users.noreply.github.com> Date: Thu, 15 Aug 2024 16:13:00 +0800 Subject: [PATCH] Update jmm.md --- docs/java/concurrent/jmm.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/java/concurrent/jmm.md b/docs/java/concurrent/jmm.md index bdba79d8..80863aa1 100644 --- a/docs/java/concurrent/jmm.md +++ b/docs/java/concurrent/jmm.md @@ -61,7 +61,11 @@ Java 源代码会经历 **编译器优化重排 —> 指令并行重排 —> 内 **指令重排序可以保证串行语义一致,但是没有义务保证多线程间的语义也一致** ,所以在多线程下,指令重排序可能会导致一些问题。 -编译器和处理器的指令重排序的处理方式不一样。对于编译器,通过禁止特定类型的编译器重排序的方式来禁止重排序。对于处理器,通过插入内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)的方式来禁止特定类型的处理器重排序。指令并行重排和内存系统重排都属于是处理器级别的指令重排序。 +对于编译器优化重排和处理器的指令重排序(指令并行重排和内存系统重排都属于是处理器级别的指令重排序),处理该问题的方式不一样。 + +对于编译器,通过禁止特定类型的编译器重排序的方式来禁止重排序。 + +对于处理器,通过插入内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)的方式来禁止特定类型的处理器重排序。 > 内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)是一种 CPU 指令,用来禁止处理器指令发生重排序(像屏障一样),从而保障指令执行的有序性。另外,为了达到屏障的效果,它也会使处理器写入、读取值之前,将主内存的值写入高速缓存,清空无效队列,从而保障变量的可见性。