美文网首页
Java多线程-Java内存模型

Java多线程-Java内存模型

作者: xgangzai | 来源:发表于2019-11-19 22:12 被阅读0次

Java内存模型是一个规范,为了解决并发模式下的可见性、原子性和顺序性问题。Java内存模型规范了JVM如何提供按需禁用缓存和编译优化的方法。具体来说,这些方法包括volatile、synchronized、final三个关键字,以及6项Happens-Before规则。

volatile

原语是禁用CPU缓存,即必须从内存中读取和写入变量。禁用缓存不是Java语言特有的,在C语言中也有这个概念。

在Java中,volatile除了代表禁用CPU缓存,还表示禁止重排???FIXME

Hapens Before规则

前面一个操作的结果对后续操作是可见的。Happens-Before约束了编译器的优化行为。6项Happens-Before规则都是针对可见性的。

1. 程序的顺序性规则

2. volatile规则

3. 传递性规则

4. 管程中锁的规则

5. 线程start规则

6. 线程join规则

顺序性规则,符合单线程里面的思维,程序前面对某个变量的修改一定是对后续操作可见的。

传递性规则,如果A Happens-Before B,并且B Happens-Before C,则A Happens-Before C。

管程中锁的规则,对一个锁的解锁Happens-Before于后续对这个锁的加锁。

不是应该先加锁再解锁吗?

管程,同步的原语,在Java中,代指synchronized。

互斥锁,解决原子性问题。原子性问题的产生原因是由于线程切换(语言级的一个操作未执行完,其他线程被CPU调度开始执行,也用到了一个对前一个线程来说未完成的变量操作结果)。

把一段需要互斥执行的逻辑成为“临界区”

锁的优化

  1. 细化粒度

细化粒度可能会带来死锁问题,

死锁定义:一组互相竞争资源的线程因互相等待,导致永久阻塞的现象。

死锁出现的四个条件:

  1. 互斥,共享资源X和Y只能被同一个线程占有;
  2. 占有且等待,线程T1已经取得共享资源X,在等待共享资源Y的时候,不释放共享资源X;
  3. 不可抢占,其他线程不能抢占线程T1占有的资源;
  4. 循环等待,线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源。

在实现中,只要破坏上面四个条件中的任意一个就可避免死锁现象。

相关文章

  • 深入理解Java并发内存模型

    Java内存模型是什么 Java 内存模型翻译自Java Memory Model,也称Java多线程内存模型,简...

  • java内存模型

    前言 在学习java多线程并发编程前,必须要了解java内存模型,只有了解java内存模型,才能知道为什么多线程并...

  • (五) volatile关键字

    Java多线程目录 1 背景 理解Java多线程的内存抽象逻辑请阅读java多线程内存模型,当代操作系统,处理器为...

  • java并发编程(四)

    java多线程编程(四) 引言: 内存模型的基础----内存模型相关的基本概念 java内存模型中的顺序一致性--...

  • JMM简介

    Java Memory Model(JMM)java内存模型,区别与java内存结构。JMM定义了一套在多线程读写...

  • 高并发Java

    高并发Java(1):前言 高并发Java(2):多线程基础 高并发Java(3):Java内存模型和线程安全 高...

  • java线程安全总结

    浅谈java内存模型 不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的。其实java的多线程并发问...

  • Java内存模型

    前言 Java内存模型(Java Memory Model,简称JMM),是针对Java在多线程并发下可能出现的各...

  • 三、内存管理

    一、java内存模型 1.程序计数器pc-----线程私有 占用内存很小;java的多线程是:抢占式的java中程...

  • 图解jvm--(四)内存模型

    内存模型 java 内存模型 很多人将【java 内存结构】与【java 内存模型】傻傻分不清,【java 内存模...

网友评论

      本文标题:Java多线程-Java内存模型

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