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

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

难度中级
时长57分
学习人数
综合评分9.63
181人评价 查看评价
9.9 内容实用
9.6 简洁易懂
9.4 逻辑清晰
  • 1.可见性:一个线程对共享变量值的修改,能够及时被其他线程看到; 2.共享变量:如果一个变量在多个线程的工作内存中都存在副本,那这个变量就是这几个线程的共享变量; 3.线程的工作内存:Java内存抽象出来的概念 4.Java内存模型(JMM-Java Memory Model):描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节 5.所有变量都存储在主内存中;而每个线程有自己独立的工作内存,在工作内存中的保存的该线程使用的变量(此变量是主内存中变量的副本) 6.Java内存的规定: 线程对共享变量的所有操作都必须在自己的工作内存中进行,不可直接从主内存中读写; 不同线程之间无法直接访问其他线程工作内存中的变量,线程间的变量值的传递需要通过主内存 7.共享变量可见性实现原理: 线程1-->工作内存1中变量X-->更新到主内存中-->工作内存2中的变量X得到更新-->线程2
    查看全部
    3 采集 收起 来源:可见性介绍

    2018-03-22

  • 多个线程访问一个成员变量时 每个线程都会得到一个该变量的副本 在自己的线程的栈中保存、计算 以提高速度。 但是这样就会有同步的问题了。 当一个线程修改了自己栈内副本的值 还没有立即将同步到主存中, 其他线程再来获取主存中的该变量时 就会得到过期数据 , 为了解决这种问题 可以使用synchronized对该变量的操作同步 , 或使用volatile关键字声明该变量为易变对象 这样的话 每个线程就不会创建副本到自己的栈中 而是直接操作主存
    查看全部
    3 采集 收起 来源:可见性介绍

    2015-04-15

  • 细说Java多线程之内存可见性——volatile能够保证可见性 一、volatile关键字: 1.能够保证volatile变量的可见性。 2.不能保证volatile变量复合操作的原子性。 二、volatile如何实现内存可见性:通过加入内存屏障和禁止重排序优化来实现的。 1.对volatile变量执行写操作时,会在写操作后加入一条store屏障指令。 2.对volatile变量执行读操作时,会在读操作前加入一条load屏障指令。 三、线程读/写volatile变量的过程: -线程写volatile变量的过程: 1.改变线程工作内存的中volatile变量副本的值。 2讲改变后的副本的值从工作内存刷新到主内存。 -线程读volatile变量的过程: 1.从主内存中读取volatile变量的最新值到线程的工作内存中。 2.从工作内存中读取volatile变量的副本。 Ps:通俗地讲:volatile变量在每次被线程访问时,都强迫从主内存中重读该变量的值,而当该变量发生变化时,又会强迫线程将最新的值刷新到主内存。这样任何时候,不同的线程总能看到该变量的最新值。 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
  • 线程执行互斥代码的过程: 1.获得互斥锁 2.清空工作内存 3.从主内存拷贝变量到最新副本到工作内存 4.执行代码 5.刷新变量到主内存 6.释放互斥锁
    查看全部
  • 笔记3
    查看全部
  • 细说Java多线程之内存可见性——synchronized解决方案 Ps1:注意:这里也许会问:“为何不加synchronized也会执行可见性,主内存及时更新被获取最新值”?因为当时定义说加synchronized一定会可见性,而不加也没说一定不会,只是有可能不会,因为现在Java做了一些优化:尽量实现可见性;但是不能保证每次都成功,只是成功概率比较大99%,但还是有1%的情况会失败。所以处于安全考虑,尽量加synchronized关键字100%成功。 Ps2:有时候依然不存在线程交叉情况,但还是会先执行第二个线程,因为第一个线程把CPU让位出来,所以为了避免这种情况,可以在第一个线程后附上代码:sleep(1000);1秒之后才有机会执行线程2。 Ps3:synchronized+sleep();黄金搭档。 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
  • ReentrantLock 要使用到try finally将共享变量的操作放到try中 释放锁的操作放到finally里 Lock类中还有一些sychronized没有的功能,读写分离锁,可中断锁
    查看全部
  • //如果还有子线程在运行,主线程就让出CPU资源 //直到所有的子线程都运行完了,主线程再继续往下执行 while(Thread.activeCount()>1){ Thread.yield(); }
    查看全部
  • 共享变量在线程间不可见的原因
    查看全部
  • JMM
    查看全部
    1 采集 收起 来源:可见性介绍

    2015-10-05

  • 辣条在哪里?老师请私聊,我给地址,邮过来就好!@MartonZhang
    查看全部
    1 采集 收起 来源:课程总结

    2015-08-18

  • synchronized实现可见性: 1.线程解锁前,必须把共享变量的最新值刷新到主内存中; 2.线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值;
    查看全部
  • 可见性
    查看全部
    1 采集 收起 来源:可见性介绍

    2015-05-05

  • JMM: 针对共享变量。 主内存,被所有线程公用。
    查看全部
    1 采集 收起 来源:可见性介绍

    2015-04-29

  • 共享可见性的原理
    查看全部
    1 采集 收起 来源:可见性介绍

    2015-04-16

首页上一页1234567下一页尾页

举报

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

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

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