- 
            
            实现共享变量的可见性,需保证两点 查看全部
- 
            
            Java内存模型 / JMM: 共享变量可见性实现的原理: 查看全部
- 
            
            Java内存模型的两天规定: 查看全部
- 
            
            Java内存模型图 查看全部
- 
            
            Java内存模型(JMM): 主内存与工作内存 查看全部
- 
            
            Java内存模型(JMM) 查看全部
- 
            
            线程执行互斥代码的过程: - 获得互斥锁 
- 清空工作内存 
- 从主内存拷贝变量的最新副本到工作内存 
- 执行代码 
- 将更改后的共享变量的值刷新到主内存 
- 释放互斥锁 
 
 查看全部
- 
            
            二、synchronized实现可见性原理 1、synchronized能够实现:原子性(同步)、可见性 2、JMM关于synchronized的两条规定 a)线程解锁前,必须把共享变量的最新值刷新到主内存中 b)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取新的值 查看全部
- 
            
            可见性分析  查看全部 查看全部
- 
            
            2、synchronized和volatile比较 a)volatile不需要加锁,比synchronized更轻便,不会阻塞线程 b)从内存可见性的角度来讲,volatile的读相当于加锁,volatile的写相当于解锁 c)synchronized既能保证可见性,又能保证原子性,而volatile只能保证可见性,无法保证原子性 查看全部
- 
            
            六、volatile总结 1、volatile适用场合 要在多线程中安全的使用volatile变量,必须同时满足: a)对变量的写入操作不依赖其当前值 不满足:number++、count=count*5等 满足:boolean变量、记录温度变化的变量等 b)该变量没有包含在其他变量的不变式中 不满足:不变式low<up 查看全部
- 
            
            volatile 不加锁即可实现可见性,比synchronized轻量级 效率高; volatile无法保证原子性所以使用时要注意;synchronized可以保证原子性 查看全部
- 
            
            二、synchronized实现可见性原理 1、synchronized能够实现:原子性(同步)、可见性 2、JMM关于synchronized的两条规定 a)线程解锁前,必须把共享变量的最新值刷新到主内存中 b)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取新的值 线程解锁前对共享变量的修改在下次加锁时对其它线程可见 3、线程执行互斥代码的过程 a)获得互斥锁 b)清空工作内存 c)从主内存拷贝变量的最新副本到工作内存 d)执行锁内代码 e)将更改后的共享变量值刷新到主内存 f)释放互斥锁 4、指令重排序 重排序:代码的书写顺序与实际执行的顺序不同,指令重排序是编译器或处理器为了提高程序性能而做的优化 a)编译器优化的重排序(编译器优化) b)指令级并行重排序(处理器优化) c)内存系统的重排序(处理器优化) 查看全部
- 
            
            多线程:snychronized与volatile比较 查看全部
- 
            
            多线程:volatile使用场景 查看全部
举报
 
             
         
                 
                 
                 
                 
                