`

15、内存屏障与高效并发

 
阅读更多

1、硬件知识缓存:断电丢失数据

缓存包括:cpu缓存、内存、显存、磁盘缓存、硬盘缓存;cpu缓存又分一级缓存和二级缓存。

一般讲的高速缓存就是cpu缓存;

i5 cpu速度 3.2GHz= 3.2G/S   

2000   ddr3 = 2G/S   

硬盘   SATA2接口 300M/S             

USB3.0 80M/S       

        高速缓存很好的处理了cpu与内存的速度差异,但也为系统增加了复杂度,缓存一致性(cache coherence),在多核cpu系统中,每个cpu都有自己的高速缓存,他们共享一个主内存(main memory),当多个cpu的任务在主内存的同一区域时,可能各自的缓存数据不一致;

        解决一致性问题,各个cpu缓存访问内存时遵循的一些协议:

        MSI(modified,shared,invalid)

        MESI(Modified Exclusive Shared Or Invalid)  Exclusive独享

        MOSI、Synapse、Firefly、Dragon Protocol等。


       cpu会对输入代码进行乱序执行优化(Out-Of-Order Execution),处理器在计算之后将乱序的结果重组,保证结果与顺序执行的结果一致,不保证程序中的各个语句计算的先后顺序与输入代码顺序一致---->一个计算任务依赖另外一个计算任务的结果,代码的顺序执行就不能保证输出结果。

       jvm的JIT也有类似的指令重排序(Insturction Reorder)优化。 

 

2、jvm内存模型(java memory model ,JMM

        JMM用来解决各种硬件和操作系统的内存访问差异,主要目标是定义程序中的各个变量的访问规则,即将变量存储内存中和从内存中取出变量 的这种底层细节;JMM指的变量是共享变量即实例字段、静态变量、数组对象不包括线程私有变量(方法参数、局部变量);JMM将变量存储在jvm主内存中(与物理内存工作模式类似),每个线程有自己的工作内存(与物理cpu缓存类似),工作内存是主内存的变量副本,线程对变量的所有操作都必须在工作区中进行,而不能直接读取主内存中的变量,且线程的工作内存是私有的,线程之间变量值的传递需要主内存来完成。

 同cpu缓存与内存之间协议一样。JMM也存在交互协议 ,

JMM定义8种操作来实现主内存与工作内存之间的交互:

lock       作用于 主内存      将一个变量设置为 只能由一条线程独占

unlock   作用于 主内存      把一个处于锁定的变量释放供其他线程使用

read      作用于 主内存      从主内存中读取出来(一次)没完成存放

load      作用于 工作内存    将读取出来的变量放入工作内存中(副本)   

use       作用于 工作内存    把工作内存中变量传递给执行引擎(多次)

assign   作用于 工作内存    把执行引擎的结果赋值给工作内存中的变量

store     作用于 工作内存    把工作内存中的变量值交给主内存中()没完成存放

write      作用于 主内存      把store交递的变量存放在主内存中

JMM只规定read、load和store、write之间一定按顺序执行,而不一定连续执行,即中间可以插入其他语句;

 

3、volatile变量

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 53 KB
  • 大小: 114.7 KB
  • 大小: 158.3 KB
分享到:
评论

相关推荐

    java内存屏障与JVM并发详解实用.pdf

    Java内存屏障与JVM并发详解实用 Java内存屏障是java并发编程中的一种机制,用于确保多线程程序的正确执行。它通过强制处理器顺序执行内存操作,从而避免了内存屏障带来的问题。在本文中,我们将深入探讨Java内存...

    JVM内存模型-重排序&内存屏障 1

    在这个模型中,内存屏障(Memory Barrier)和重排序(Reordering)是两个关键概念,它们对并发编程的正确性和性能有着重要影响。 **重排序** 重排序是指编译器和处理器为了优化程序性能,可能会改变程序执行顺序的...

    深入理解并发编程

    内存屏障是一种同步机制,可以保证内存操作在处理器上的执行顺序,确保多线程或进程对共享内存的访问不会发生数据不一致的情况。互斥锁是一种用于控制多个线程对共享资源访问的同步机制,确保同一时刻只有一个线程...

    Java并发编程与高并发解决方案笔记-基础篇.docx

    JMM通过内存屏障和volatile、synchronized关键字来保证并发编程的安全性。 5. **并发的优势与风险** - **优势**:并发能提高系统资源利用率,提升程序响应速度,特别是在多核环境下,可以显著提高性能。 - **风险...

    Java并发编程(17)深入Java内存模型-内存操作规则

    4. **内存屏障**:JMM 使用内存屏障来保证指令重排序不会破坏内存模型的规定。写屏障确保在写入变量之后,其他线程能看到这个变化;读屏障则确保在读取变量之前,能看到所有已完成的写操作。 5. ** Happens-Before ...

    memory-barriers.pdf

    内存屏障是计算机科学中的一...理解内存屏障的工作原理和使用场景对于设计高效稳定的操作系统内核和并发程序至关重要。通过这些知识,开发者能够确保程序的正确性和性能,防止因并发访问导致的数据竞争和不一致性问题。

    java线程与并发编程实践

    总之,Java线程与并发编程是构建高效、稳定系统的关键技术,通过深入学习和实践,开发者可以更好地应对复杂并发场景,提高应用程序的性能和响应性。这本书正是为此目的而准备的,它提供的实战经验和详细解释将对Java...

    深入理解Java内存模型

    内存屏障可以阻止处理器重排序某些指令,确保有序性,并刷新处理器的写缓冲区,从而保证数据对其他处理器可见。 现代处理器使用写缓冲区来临时保存向内存写入的数据,写缓冲区允许处理器继续执行后续指令,而不需要...

    一文读懂原子操作、内存屏障、锁(偏向锁、轻量级锁、重量级锁、自旋锁)、Disruptor、Go Context之上半部分.doc

    并发编程与锁机制 本文将从 CPU 硬件设计带来的优势和问题入手,讲解并发编程中的原子操作、锁机制、Disruptor 框架和 Go 语言中的 Context 概念。 一、并发编程概述 并发编程是指在多个任务之间分配执行时间的...

    Disruptor并发框架中文参考文档

    LMAX的业务逻辑处理器能够在单个线程中每秒处理600万笔订单,这得益于Disruptor的高效并发处理能力。LMAX的系统完全运行在内存中,使用事件源驱动的方式进行操作。 ##### 3.2 通过Axon和Disruptor处理1Mtps Axon是...

    JAVA并发编程艺术pdf版

    - **java.util.concurrent** 包:提供了各种并发工具类,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(倒计时器)和ExecutorService(线程池)等。 - **Future和Callable**:Future接口...

    Java虚拟机并发编程.pdf

    JMM通过内存屏障和重排序规则确保了跨线程的数据一致性。 `synchronized`关键字是Java中用于线程同步的主要手段。它可以保证同一时间只有一个线程访问特定代码块,防止数据竞争。`synchronized`可以应用于方法或...

    Java并发体系.pdf

    volatile通过内存屏障和特定的内存语义保证了线程间的数据同步,避免了缓存不一致的问题。 在实际应用中,如DCL(Double Check Locking)单例模式,我们需要关注重排序可能导致的问题。为了解决这个问题,我们可以...

    并发编程实战

    《并发编程实战》是一本深度探讨Java多线程与并发技术的专业书籍,旨在帮助开发者深入理解并掌握在Java环境中如何高效、安全地进行并发编程。这本书涵盖了从基础概念到高级特性的广泛内容,旨在提升读者在多核处理器...

    Java高并发程序设计模式资料

    12. **Java内存模型(JMM)**:理解JMM如何保证多线程环境下的数据一致性,了解volatile关键字的作用以及内存屏障的概念。 以上内容仅是Java高并发程序设计模式的一部分知识点,实际应用中还需要结合具体业务场景和...

    JAVA并发编程实践(英文版+中文1-9章)

    2. **并发控制**:Java提供了多种并发控制机制,如synchronized关键字、volatile变量、Lock接口(ReentrantLock、ReadWriteLock等)、Semaphore信号量、CountDownLatch倒计时锁和CyclicBarrier同步屏障等,这些工具...

    Java内存模型1

    然而,对于共享可变状态的并发程序,无序的内存操作可能导致数据一致性问题,这就需要使用内存屏障来强制执行顺序,确保并发安全。 举例来说,在多CPU系统中,每个CPU有自己的缓存。如果两个CPU同时访问同一块内存...

    探秘Java并发:Atomic&Unsafe的强大魔法

    内存屏障和线程调度:文章详细解释了内存屏障的概念和线程调度的实现。这对于理解Java内存模型和线程管理机制至关重要。性能优化:通过高效使用Atomic类和合理运用Unsafe类,可以显著提高Java应用程序的并发性能和...

    java并发编程

    Java并发编程是Java开发者必须掌握的...此外,书中还可能涉及Java内存模型、线程通信(如wait/notify机制)以及并发设计模式等高级主题。总的来说,Java并发编程是一门深奥的学问,需要不断学习和实践才能真正精通。

Global site tag (gtag.js) - Google Analytics