zoukankan      html  css  js  c++  java
  • Java并发机制(3)--volatile关键字与内存模型

    Java并发编程:volatile关键字解析及内存模型

    1、线程内存模型:
      缓存一致性协议(如MESI),每个线程有单独的内存存放共享变量的副本。
      它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

    2、并发中的三个概念
      2.1原子性:要么不执行,要么执行不被打断;
      2.2可见性:一个线程修改共享变量的值,其他线程能立即看到;
      2.3有序性:jvm会对代码进行指令重排序;虽然不会影响单一线程的结果,但会影响多线程条件下的正确性;
    3、java内存模型:
        jvm规范视图制定一种java内存模型(jmm)屏蔽各个硬件平台和操作系统的内存访问差异。在jmm中也会存在缓存一致性和指令重排序问题;
      3.1原子性:jmm只保证基本读取和基本赋值(x=y不是)是原子性操作;
      3.2可见性:volatile关键字:当某个线程修改共享变量的值时,会立即将其更新到主存,并使其他线程内的值无效,通知其从新从主存读取;
           synchronized和Lock也能保证可见性:同一时刻只有一个线程获取锁,更新值,在所释放前,更新到主存。
      3.3有序性:volatile只能保证一定的有序性,
            synchronized和Lock能完全保证。
            jmm具备部分先天有序性:happen-before原则;
    4、volatile对三种概念的支持:
      4.1可见性:完全支持,修改后写入主存,通知其他对应变量线程缓存无效,从主存读;
      4.2原子性:无法保证,如对volatile int n;thread1读取变量n,并检查缓存有效,然后被阻塞;thread2读取n后修改,写会主存阻塞;thread1继续running,还是修改前的值。
      4.3有序性:一定程度,volatile禁止指令重排序:如volatile i++;它保证volatile之前所有对i的操作都已经被执行,且i++发生在所有后续代码执行之前。
    5、volatile的底层原理:
      实际上在class文件中,标有volatile的变量在进行写操作时,会在前面加上lock质量前缀:
      5.1将当前处理器缓存行的数据写回到内存。lock指令前缀在执行指令的期间,会产生一个lock信号,lock信号会保证在该信号期间会独占任何共享内存。lock信号一般不锁总线,而是锁缓存。因为锁总线的开销会很大。
      5.2将缓存行的数据写回到内存的操作会使得其他CPU缓存了该地址的数据无效。
    6、应用场景:
      6.1状态标记量 volatile boolean flag = false;
      6.2双重检查double check

    java的内存模型Jmm如下:

    详情移步:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920373.html

  • 相关阅读:
    分组与子报表Active Report6 使用(二)
    网站开发人员应该知道的62件事[转]
    如何恢复SVN中已删除文件或文件夹
    java中的List排序[转]
    [原]ActiveReport6 for net使用(一)
    Windows XP 不用输入密码自动登录
    IE不加载ActiveX控件的解决办法
    winRAR 打包小技巧
    iis负载均衡与文件同步[网摘]
    ASP.net的PDF打印(水晶报表)[摘]
  • 原文地址:https://www.cnblogs.com/whtblog/p/8876113.html
Copyright © 2011-2022 走看看