
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据一致性问题是程序员在开发软件的时候需要重点关注的一个问题,而今天我们就通过案例分析来了解一下,软件开发一致性都包含哪些要求。
现代计算机CPU运算速度是极高的,从主内存中拿数据的操作往往跟不上CPU的运算速度从而造成CPU资源极大的浪费,为了避免这种浪费会在主内存和CPU之间加上一个速度能跟上CPU的高速缓存区,内存中的数据会copy到高速缓存区中,CPU直接跟高速缓存区打交道,这样做无疑可以提高CPU的效率,但是在多CPU的情况下就会出现缓存一致性的问题,当多个CPU的运算任务涉及到同一块内存区域的时候将可能导致各自的缓存数据不一致的情况,为了规避这种情况就需要定义一个“缓存一致性协议”。
缓存一致性协议规定了处理器在读写数据的时候需要遵循的一些规范,当CPU写数据的时候如果发现其它的CPU中也包含这个数据的副本拷贝那么会发出通知其它的CPU这个数据已经过时了是无效的,其它的CPU会把这个数据设置为无效,当它们需要这个数据的时候会从内存中重新读取。
每个处理器通过监听在总线上传播的数据来检查自己的缓存值是不是过期了,如果处理器发现自己缓存行对应的内存地址修改,就会将当前处理器的缓存行设置无效状态,当处理器对这个数据进行修改操作的时候,会重新从主内存中把数据读到处理器缓存中。
vloatile的原子性原子性指你的操作过程是不受外界干扰可以一次性操作完成的,在前面单例设计模式的例子中已经证明了volatile不是原子性的,它仅仅只是帮助我们实现了内存可见性以及禁止指令重排序,在程序清单1.2中我用sum++的操作验证了如果在JVM中你的操作步骤是受干扰的那么volatile不能保证线程安全,但是针对一些原子性操作如程序清单1.1仅仅只是只是对volatile修饰的变量进行读写的操作是线程安全的,所以仅仅只是对volatile修饰的变量进行单纯的赋值是安全的,但是进行一些复合性的操作比如i++或者flag=!flag的操作无法确保原子性自然也就会出现线程安全问题。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。