JVM-Java内存模型-20200217

Posted 小马000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM-Java内存模型-20200217相关的知识,希望对你有一定的参考价值。

Java内存模型(JMM)与线程安全

1:JMM其实是java虚拟机栈的一部分

2:主内存和工作内存:都属于Java虚拟机内存

主内存:主要对应于JVM内存区域中的堆内存中的对象实例数据部分

工作内存:主要对应于JVM内存区域中的虚拟机栈中的部分区域

主内存与工作内存的数据交换操作的过程(通过总线bus通信,涉及总线嗅探机制及缓存一致性知识、MESI通信协议):

涉及八个原子操作:lock(锁定), unlock(解锁), read(读取), load(加载), use(使用), assign(赋值), store(存储), write(写入)

3:volatile 修饰的变量的特殊性

volatile 是虚拟机提供的最轻量级的同步机制;

被volatile修饰的变量将具备以下两种特性:

1)可见性:一个变量修改了这个变量的值时,所有共享此变量的线程都会立即知道

2)禁止指令重排序优化(机器级别语言-汇编):内存屏障概念

注:final修饰的字段在构造器种初始化成功后,对其他线程也可见

4:java 内存模型的特征:

1)原子性:某些操作是原子的

2)可见性:一个变量修改了这个变量的值时,所有共享此变量的线程都会立即知道

3)有序性:先行发生原则提供部分保障--操作A在B之前发生,则A产生的影响能被B观察到,影响包括修改了内存中共享变量的值、发送消息、调用方法等

  Java内存模型提供了8种默认的先行发生关系:

  1:程序次序规则  2:管程锁定规则  3:volatile变量规则  4:线程启动规则  5:线程终止规则  6:线程终端规则  7:对象终结规则 8:传递性

5:java线程安全实现方法:

1)互斥同步:互斥是方法,同步是目的--例如synchronized 和JUC并发包下的ReentrantLock [riː\'entrənt] (重入锁)

  ReentrantLock:等待可中断、可实现公平锁、以及锁可以绑定多个条件,JDK1.6以后他们的性能基本一样,更倾向于用synchronized实现。

2)非阻塞同步:乐观的并发策略--CAS操作(JDK1.5之后的包sun.misc.Unsafe类,启动类加载器(Bootstrap ClassLoader)加载的Class才能访问它;ABA问题)

3)无同步方案:不涉及数据共享的代码天生就是线程安全的--可重入代码和线程本地存储(java.lang.ThreadLocal类)

6:多线程锁优化

1)自旋锁与自适应锁   2)消除锁  3)粗化锁   4)轻量级锁     5)偏向锁

以上是关于JVM-Java内存模型-20200217的主要内容,如果未能解决你的问题,请参考以下文章

JVM-Java内存运行时数据区域介绍

JVM-Java内存区域与内存溢出异常

JVM-Java内存区域与内存溢出异常

JVM-Java内存区域与内存溢出

jvm-Java对象的创建访问

深入理解JVM-Java垃圾回收机制GC