为了账号安全,请及时绑定邮箱和手机立即绑定

细说Java多线程之内存可见性

难度中级
时长57分
学习人数
综合评分9.63
181人评价 查看评价
9.9 内容实用
9.6 简洁易懂
9.4 逻辑清晰
  • 不同线程之间无法访问各自的变量,需要通过主内存进行交互
    查看全部
    0 采集 收起 来源:可见性介绍

    2016-07-23

  • 两条规定,线程对共享变量操作只能在工作内存中进行
    查看全部
    0 采集 收起 来源:可见性介绍

    2016-07-23

  • 线程和自己的工作内存交互,主内存和工作内存之间也有交互关系
    查看全部
    0 采集 收起 来源:可见性介绍

    2016-07-23

  • 线程有自己的工作内存,所有变量存储在主内存中,线程中保存主内存变量的副本
    查看全部
    0 采集 收起 来源:可见性介绍

    2016-07-23

  • JMM,java 底层细节知识
    查看全部
    0 采集 收起 来源:可见性介绍

    2016-07-23

  • 多个线程中有共享变量的副本
    查看全部
    0 采集 收起 来源:可见性介绍

    2016-07-23

  • 共享变量
    查看全部
    0 采集 收起 来源:可见性介绍

    2016-07-23

  • Java内存模型图
    查看全部
    0 采集 收起 来源:可见性介绍

    2016-07-22

  • volatile通过内存屏障和禁止指令重排序实现可见性
    查看全部
  • 可见性:一个线程对共享变量的修改, 能及时的呗其他线程看到 共享变量:如果一个变量 在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。 java内存模型:Java Memory Model描述了java程序中各种变量(线程共享变量)的访问规则,以及在jvm中将变量存储到内存和从内存中读取出这样的底层细节。 所有变量都存储在主内存中。 每个线程都有自己独立的工作内存, 里面保存该线程使用到的变量的副本。 两条规则: 1)线程对共享变量的所有操作都必须在自己的工作内存中进行,而不能直接从主内存中读写。 2)不同线程之间无法直接访问其他线程工作内存中的变量,线程间变量值得传递需要通过主内存完成。 导致共享变量在线程间不可见的原因: 1. 线程的交叉执行-》原子性 2. 重排序结合线程交叉执行-》原子性 3. 共享变量更新后的值没有在工作内存与主内存间及时更新-》可见性 可见性实现: 1、synchronized,实现原子性,可见性。 线程解锁前,必须把共享变量的最新刷新到主内存中 线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值。 可以保证可见性。 2、volatile 1)能够保证volatile变量的可见性 2)不能保证volatile变量符合操作的原子性。Number++(从内存取number,number++,保存到内存三个步骤) 深入来说:通过加入内存屏障和禁止重排序优化来实现的。 1)对volatile变量执行写操作时,会在写操作后加入一条store屏障指令。 2)对volatile变量执行读操作时,会在读操作前加入一条load屏障指令。 Volatile如何实现内存可见性:通俗讲,volatile变量在每次被线程访问时,都强迫从主内存中重读该变量的值,而该变量发生变化时,又会强迫线程将最新的值刷新到主内存。 Synchronized 和 volatile 比较: 1) volatile不需要加锁,比synchronized更轻量级,不会阻塞线程; 2) 从内存可见性角度,volatile读相当于加锁,写相当于解锁。 3) Synchronized即能保证可见性,又能保证原子性,而volatile只能保证可见性,无法保证原子性。
    查看全部
    0 采集 收起 来源:可见性介绍

    2016-07-19

  • 多线程中 long和double java内存模型有可能分解为2个32位数字 这样就又可能出现读取半个变量的问题 但是目前大多数商用平台都已经自动对64位数据类型做了原子性操作 不用处理 保险起见可以加上volatile
    查看全部
    0 采集 收起 来源:课程总结

    2016-07-17

  • synchronized与volatile的比较。volatile效率高,但不能保证锁内部代码块的原子性,,,
    查看全部
  • volatile的使用场景。1.volatile下次值不能与当前值有依赖关系,比如不能有num 或 number=number*1 2.不能与其他的volatile变量有固定表达式的关系,比如volatile1>volatile2
    查看全部
  • ReentrantLock实现共享变量操作原子性与内存可见性的方法,首先 Lock lock =new Reentrantlock() 然后在需要保证原子性操作的方法前调用lock.Lock() 使用try.catch.finally,在try块中放入方法,在finally中调用解锁方法lock.unlock()
    查看全部
  • 保证number 操作原子性的三种方式
    查看全部

举报

0/150
提交
取消
课程须知
学习本课程前,你需要熟练掌握Java的基础语法,熟悉Java多线程的基础知识,以及synchronized实现线程同步的方法。
老师告诉你能学到什么?
1、内存可见性 2、指令重排序 3、as-if-serial语义 4、synchronized实现可见性 5、volatile实现可见性

微信扫码,参与3人拼团

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!