java内存区域和内存模型是不一样的东西,内存区域是指Jvm运行时将数据分区存储,强调对内存空间的划分。而内存模型是定义了线程和主内存之间的关系,即JVM在计算内存中的工作方式,如果我们想要深入了解JAVA并发编程,就要先理解好JAVA内存模型。
多线程编程的三个重要特性:
- 原子性:多个线程对一段代码的操作是互斥的
- 可见性:一个线程对于变量做出的修改能够及时被其他线程查看到
- 有序性:除了满足happens-before原则的语句,其他的基本指令的顺序都是可以被编译器优化的
以上三个特性是实现线程安全的基础。
原子性
java中提供多种保证原子性的机制:
- CompareAndSwap(CAS)
意即比较并交换,这里使用了CPU的CAS指令保证了操作的原子性,当一个线程要改变一个变量t的值,需要向cpu提供期待的t的值x,以及调整后的值y,CAS指令会比较主内存中t的真实值和x,如果两者相等,就把y赋值给t,否则不做任何操作。
java.util.concurrent.atomic(JUC)包中提供了支持CAS操作的工具类,包括针对基本数据类型的AtomicInteger、AtomicLong等,以及针对未知对象的AtomicReference,或者是针对对象的某个变量的AtomicReferenceFieldUpdater。它们的基本思路就是在一个while循环中调用CAS,直到修改成功。