第一个重点:要了解,多线程之间的通信机制有两种,共享内存和消息传递。另外除了主存之外,每一个线程都有一个私有的本地内存空间(Local memory)。本地内存中存储了该线程以读/写共享变量的副本。其实本地内存是JMM的一个抽象概念,并不真实存在,它涵盖了缓存,写缓存区,寄存器以及其他的硬件和编译器的优化。
第二个重点:重排序的问题。
在执行程序的时候,为了提高性能,编译器和处理器常常会对指令做重排序,重排序分为3种。
1:编译器优化的重排序。
2:指令集并行重排序。
3:内存系统的重排序。
最后,对volatile进行介绍,它具有以下特性。
1)可见性。对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。
2)原子性。对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。
3)根据之前所说的通信机制,volatile是通过清除第二个线程中已有的本地内存中的变量信息为无效,使得线程B不得不去主线程去获取共享变量以得完成变量的可见性。
4)volatile修饰的变量的读、写都会在每一次读写前会加入屏障,来禁止程序的重新排序。