volatile 介绍
1. 缓存的概念,为什么要有缓存?
在未采用缓存的之前,CPU都是直接访问主内存、虽然随着CPU制造工艺的提升,刷新频率的提高,内存受限于制造工艺和制造成本的限制,提升空间较小,导致了CPU与主线程访问频率过高,通过传统的FSB直接访问内存的方式会导致CPU资源受到很大的限制,为了降低CPU吞吐量,在CPU和主存中间加了缓存的设计。
2. 缓存运行方式以及缓存不一致性的问题
1: 在程序运行的时候,会将所需要的共享数据从主内存中拷贝一份放置缓存中,计算结束之后、在刷新之主内存中。
2:多个线程操作下,会出现缓存不一致的情况,所以现有解决办法是缓存一致性协议,如果当前变量为共享变量的话,只是读操作的话,不做任何处理,一旦涉及写操作、发出信号通知其他CPU将cache line设为无效,其他cpu在读取的时候,需要冲主内存中再次获取
3. java内存模型
1:共享变量都存储在主内存中、每个线程都可以访问。
2:每个线程都有私有的工作内存称之为本地内存
3:工作内存只存储共享变量的的副本
4: 线程不能直接操作主内存,先操作了工作内存之后在能再次写入主内存中,
4. 并发编程的特性
1:原子性 一个操作,要不全部成功,要不全部失败
2:可见性 一个线程修改共享变量、另外一个可见
3:有序性 有顺序的执行
原子性,单个赋值或者读取是原子性的,多个原子性聚合是非原子性的,例如x++,第一步,获取x的值为原子性操作,在、+1,然后在保存在主内存中
1:可见性
2:volatile ,syn,lock三种方式可以保证可见性,有序性.
3:volatile 在保证有序性的时候,直接禁止重排序
5. volatile 保证可见性
有volatile修饰的共享变量在进行写操作的时候会多出第二行汇编代码,一个.lock的前缀指令,.lock的指令在多核处理器中会引发两件事、
1:将当前缓存行重写至主内存中
2:写回主内存会使其他缓存中的共享变量置为失效
6. volatile 用法
修饰实例变量或者类变量