java内存模型

作者: 圣村的希望 | 来源:发表于2018-04-15 01:38 被阅读0次

    1、并发编程中有两个关键问题:线程通信和线程同步
    a、线程通信:是指线程之间通过何种机制来进行信息的交换
    b、线程同步:是指用于控制线程之间操作发生的相对顺序的机制
    线程通信可以通过共享内存和消息传递,在共享内存的并发模型里,线程之间通过对共享内存的读写进行隐式通信,但是线程同步必须是显式的。java并发采用的是共享内存的模型。

    2、java内存模型(JMM)是一种抽象模型,它定义了线程和主内存之间的关系,线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存存储了该线程的共享变量的副本。

    3、重排序:java程序从源代码到汇编指令,为了提高性能,编译器和处理器往往会对指令进行重排序。
    a、编译器重排序:编译器在不改变单线程程序语义的前提下,会重新安排语句的执行顺序。
    b、处理器重排序:处理器将多条指令重叠执行,在不存在数据依赖的情况下,处理器可以改变语句对应机器指令的执行顺序
    c、内存系统的重排序:由于处理器使用读写缓冲区,这使得加载和存储操作看上去可能是乱序执行的

    4、先行发生原则(happens-before):一个操作对另一个操作是可见的,不管怎么重排序,保证单线程的程序执行结果不能被改变,还能保证正确同步的多线程程序执行结果不被改变。

    5、as-if-serial语义:不管怎么重排序(编译器和处理器重排序),单线程的执行结果不改变

    6、数据依赖:两个操作访问同一个变量,并且有一个是写操作,这两个操作之间存在数据依赖。
    7、控制依赖:有控制条件的关系

    8、顺序一致性模型:
    a、一个线程中的所有操作必须按照程序的顺序来执行
    b、所有线程都只能看到一个单一的操作执行顺序,每个操作都必须原子执行且对所有线程立即可见

    9、锁不仅对临界区有互斥的作用,还有内存语义,释放锁的时候会把共享变量的值刷新到主内存,获取锁的时候共享变量值的读取直接从内存里面拿
    释放锁的内存语义和volatile写的内存语义相同,获取锁的内存语义和volatile读的内存语义相同

    10、concurrent包的实现:
    底层使用CAS加volatile变量
    上层使用AQS、非阻塞数据结构和院子变量类来实现
    对外提供Lock、同步器、阻塞队列、Executor和并发容器

    相关文章

      网友评论

        本文标题:java内存模型

        本文链接:https://www.haomeiwen.com/subject/vyyacftx.html