也就是把 load和use关联执行,把assign和store关联执行。众所周知有load必需有read现在load又和use关联也就是要在缓存中要use的时候就必须要load要load就必需要read。通俗讲就是要use(使用)一个变量的时候必需load(载入),要载入的时候必需从主内存read(读取)这样就解决了读的可见性。下面看写操作它是把assign和store做了关联,也就是在assign(赋值)后必需store(存储)。store(存储)后write(写入)。也就是做到了给一个变量赋值的时候一串关联指令直接把变量值写到主内存。就这样通过用的时候直接从主内存取,在赋值到直接写回主内存做到了内存可见性。
无锁编程我在网上看到大部分写多线程的时候都会写到锁,AQS和线程池。由于网文太多本文就不多做介绍。下面简单写一写CAS。
CAS是一个比较魔性的操作,用的好可以让你的代码更优雅更高效。它就是无锁编程的核心。
CAS书上是这么介绍的:“CAS即Compare and Swap,是JDK提供的非阻塞原子性操作,它通过硬件保证了比较-更新的原子性”。他是非阻塞的还是原子性,也就是说这玩意效率更高。还是通过硬件保证的说明这玩意更可靠。
从上图可以看出,在cas指令修改变量值的时候,先要进行值的判断,如果值和原来的值相等说明还没有被其它线程改过,则执行修改,如果被改过了,则不修改。在java里边java.util.concurrent.atomic包下边的类都使用了CAS操作。最常用的方法就是compareAndSet。其底层是调用的Unsafe类的compareAndSwap方法。