JUC是java.util.concurrent包的简称,主要包含了jdk中多线程相关的技术,例如锁、信号、线程安全的容器、线程池等,本节内容为JUC的基础-原子操作。
为什么会有原子操作
在多线程中,指令的执行在很多情况下会被打断,导致结果的不确定性,例如中断、线程的抢断以及多核SMP系统中程序的并发执行等,因此在这种情况下怎样对一些共享的资源进行原子操作就至关重要,当前的原子操作主要可以通过软件和硬件方式实现。
1. 在以前的X86系统中,在硬件层面主要是通过在指令中通过LOCK前缀锁总线实现,但是由于总线是通用的,因此效率会比较低,当前大多数的x86处理器都是通过锁定缓存行来保证原子性,但是如果操作的数据扩越了多个缓存行,还是要使用总线锁定的方式保证原子性。
2. 在java中原子性主要是通过锁和CAS(compare-and-swap)实现,其中CAS就是通过CMPXCHG指令实现的,实现的基本原理就是循环进行CAS操作直到成功为止。
java中的原子操作
1. 在32位的jvm中,除了long和double类型为,其他的赋值操作都会原子的。
2. 在64位的jvm中,所有赋值操作都是原子的。
3. volitle修饰的long和double在32位jvm下回保证原子性。
4. 所有referenc的赋值。
5. 善于使用java.util.concurrent.atomic.*包下的原子操作类。