==== 原子操作 ==== 也可以理解为“锁”,锁的目的就是为了保证原子操作嘛,说白了就是某一时刻只允许一个线程操作,不允许相关的线程干扰 原子操作有2个层级可以实现: - cpu指令级别(单个指令的原子性) - 方法:调用lock前缀的汇编指令 - 带有lock前缀的指令在执行期间会锁住总线,让其他cpu无法执行,达到原子性的目的 - 应用程序内部级别 - synchronized:(代码块的原子性) - java中的锁不会依赖类似lock前缀的汇编指令实现的,而是通过线程间的互斥。是在jvm源码中实现的(c++编写的),大概逻辑是: - 监控一个代码块的入口和出口。 - 第一个线程可以顺利进入执行代码 - 第二个,第三个线程...变成挂起状态,进入等待队列 - 第一个线程执行完毕,通知等待队列中的线程:你们中可以选一个区执行啦.... - java.util.concurrent.locks.Lock:用java写的 - 和synchronized内部实现差不多,只是lock提供了更多灵活的功能:如条件锁。 但是synchronized会稍好一些 ==== 原子操作常用技术 ==== * final:提供可见性 * volatile:保证能读取到最近一次修改 * synchronized:保证每个时刻只有一个人操作代码,并能保证下个线程读取到最新值 * concurrent包:和synchronized作用类似 * cas(compare and swap)操作:对比跟新。 * cas是CPU级别的原子操作,操作时会锁住总线 * cas通常和volatile类型的数据一起担任信号量的状态的变更的任务(concurrent.Lock的非公平锁、原子类都大量使用volatile和cas) * 如果当前值和期望值一样,跟新成功,否则返回当前值 * cas没有阻塞作用,常用于乐观锁实现 === Cas方法 === 作用:原子的更新一个值 总共存在三个操作数:预期值A、内存中的V、修改的值B。当且仅当预期值A和内存中的值V相同,则将内存V值修改为B,否则返回V