老王:小陈啊,上一章我们讲了usafe是个啥东西,以及unsafe提供的几大类的功能
老王:这一章啊,我们要花个时间专门讲unsafe提供的cas功能,这个cas的功能是我们后面将Atomic原子类体系的基础。
小陈:cas功能?上一章的时候不是已经介绍过了吗?
老王:上一章只是简单的介绍了一下CAS功能而已,但是关于unsafe的cas功能底层是怎么保证原子性的?在操作系统层面是怎么实现的?这些东西我们还没有讲。
由于的后面的并发知识非常多的使用到了unsafe的cas功能,所以啊,我们今天专门花一章的时间,来把CAS底层的原理弄懂
小陈:哦哦,原来是这样啊......
老王:上一章我们讲解CAS操作的时候,是直接通过( 对象地址 + 对象内部属性偏移量offset )直接定位到要修改的变量在内存的位置,然后在内存级别的比较数据和修改数据。也就是像下面的图一样:
操作的时候直接根据 o对象地址 + offset偏移量地址,定位到demo属性在内存的位置,然后直接操作内存修改数据。
老王:由于CPU是不会直接读写主存的,数据读取的时候还是先将数据读取到高速缓存,然后通过高速缓存传递给CPU;写数据的时候也是先高速缓存,然后再将高速缓存的数据写入内存;于是可以得到下面的图形:
老王:小陈啊,想想一下上面的那副图,如果在多线程并发操作的时候会有什么问题?
小陈:多个线程或者多个CPU同时读取和修改demo属性的时候,可能会导致数据不一致的