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

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

难度中级
时长57分
学习人数
综合评分9.63
181人评价 查看评价
9.9 内容实用
9.6 简洁易懂
9.4 逻辑清晰
  • 1.write happens-before read; unlock happens-before lock 2.volatile关键字 能够保证volatile变量的可见性; 不能保证volatile变量复合操作的原子性 3.volatile实现内存可见性:通过加入内存屏障和禁止重排序优化来实现 对volatile变量执行写操作时,会在写操作后加一条store屏障指令; 对volatile变量执行读操作时,会在读操作前加一条load屏障指令;
    查看全部
  • final也可以保证内存的可见性;
    查看全部
    0 采集 收起 来源:课程总结

    2015-04-07

  • 共享数据都必须被修饰为private
    查看全部
    0 采集 收起 来源:练习题

    2015-04-07

  • synchronized与volatile比较
    查看全部
  • 要在多线程中安全的使用volatile变量,必须同时满足: 对变量的写入操作不依赖其当前值;(不满足:number++,count=count*5;满足:boolean变量) 该变量没有包含在具有其他变量的不变式中(不满足:low<up)
    查看全部
  • 1.ReentrantLock private Lock lock = new ReentrantLock();//可重入锁 public void increase() { lock.lock();//注意:锁内部的操作需要放到try...finally中执行 try{ this.number++;//number的可见性+number++的原子性 }finally{ lock.unlock();//释放锁资源 }
    查看全部
  • 1.解决volatile变量的原子性: 使用synchronized关键字; ReentrantLock(JDK1.5以上,java.util.concurrent.locks); AtomicInterger(JDK1.5以上,java.util.concurrent.atomic)
    查看全部
  • /* * 如果还有子线程在运行,主线程就让出cpu资源,知道所有的子线程都运行完了,主线程在继续向下运行 */ while(Thread.activeCount() > 1) { Thread.yield(); }
    查看全部
  • 1.write happens-before read; unlock happens-before lock 2.volatile关键字 能够保证volatile变量的可见性; 不能保证volatile变量复合操作的原子性 3.volatile实现内存可见性:通过加入内存屏障和禁止重排序优化来实现 对volatile变量执行写操作时,会在写操作后加一条store屏障指令; 对volatile变量执行读操作时,会在读操作前加一条load屏障指令;
    查看全部
  • 1.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行; 2.当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块 3.当一个线程访问object的一个synchronized(this)同步代码块时,他就获得了这个object的对象锁,结果其他线程对该object对象所有同步代码部分的访问都被暂时阻塞
    查看全部
    0 采集 收起 来源:练习题

    2015-04-07

  • 1.线程不安全的情况下,导致代码执行的结果不可定,所以需要解决线程不安全即共享变量的可见性
    查看全部
  • 1.数据依赖关系才可以禁止重排序;即使是控制依赖关系也不可以禁止重排序; 2.共享变量的不可见造成线程不安全 3.共享变量不可见的原因: 线程的交叉执行; 重排序结合线程交叉执行; 共享变量更新后的值没有在工作内存和主内存中及时更新,未及时更新 4.synchronized解决不可见的方案: 原子性--由于锁的关系,线程之间不允许交叉执行 原子性+as-if-serial语义--线程不能交叉执行,重排序对于单线程不能影响运行结果 可见性--共享变量的更新执行
    查看全部
  • 1.Java语言层面支持的可见性:synchronized和volatile 2.synchronized实现可见性:锁,同步 原子性(同步) 可见性 3.JMM关于synchronized的规定: 线程解锁前,必须把共享变量的最新值刷新到主内存中; 线程加锁时,将清空工作内存中的共享变量的值,使用共享变量时需要从主内存中重新读取最新的值; 注意:加锁与解锁使用的是同一把锁 4.重排序:代码顺序与执行顺序可能不同 5.as-if-serial语义:无论如何重排序,程序执行的结果应该与代码顺序执行的结果一致 Java编译器,运行时和处理器都会保证Java在单线程下遵循as-if-serial语义
    查看全部
  • 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

  • 多线程-数据争用-内存可见性
    查看全部

举报

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

微信扫码,参与3人拼团

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

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