Java编发编程之原子操作与CAS原理分析
引子 之前的文章我们简单介绍了线程安全的三个核心概念可见性和有序性和原子性, 那么这篇文章我们就来分析一下原子性操作的实现原理 原子操作 原子本意为不可分割的最小粒子,而原子操作则为不可中断的一个或者系列操作 注意的是对一部分操作保持了原子性并不意味着就不会发生线程安全问题, 而是要保证整个临界区都是原子性的。 下面我们来分析一下cpu和java中如何实现原子操作 Cpu实现 CPU使用基于缓存加锁或者总线加锁实现多个CPU的原子性操作 cpu自动保证基本内存操作的原子性 处理器保证从系统内存当中读取或者写入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址,但是复杂的内存操作处理器不能自动保证其原子性,比如跨总线宽度,跨多个缓存行,跨页表的访问。 但是处理器提供总线锁定和缓存锁定两个机制来保证复杂内存操作的原子性 总线加锁使同时只有一个cpu能独占内存进行操作 原因是有可能多个处理器同时从各自的缓存中读取变量,分别进行操作,然后分别写入系统内存当中。那么想要保证读改写共享变量的操作是原子的,就必须保证CPU1读改写共享变量的时候,CPU2不能操作缓存了该共享变量内存地址的缓存。 处理器使用总线锁就是来解决这个问题的。所谓总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住