zoukankan      html  css  js  c++  java
  • 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)偏向锁

  • 相关阅读:
    CSS3笔记
    HTML5新标签
    前端工程师面试题JavaScript部分(第五季)
    前端工程师面试题JavaScript部分(第四季)
    前端工程师面试题JavaScript部分(第三季)
    前端组件开发方式(二)
    前端组件开发方式(一)
    面向对象的代码研究(一)
    ServiceDemo,ClientDemo Socket chat
    Socket(java基础)
  • 原文地址:https://www.cnblogs.com/xiaoma000deblog/p/12539716.html
Copyright © 2011-2022 走看看