ThreadLocal(线程局部变量)
为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。
volatile 修饰符
多线程中,防止主存中的数据与各个线程工作内存中的数据不一致,用来保证数据的一致性。
从内存角度解释会更好解释,每个线程都由 CPU 去执行,都有自己的缓存,程序在执行时都会先从主存中载入输入,操作完成后再写入主存,这个时候如果多线程操作的话多个线程之间有时间差,如果前面的操作的还没有同步回主存,别的线程又已经载入在自己的缓存中,那就会出现缓存不一致的情况。
计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。
i = i + 1;
当线程执行这个语句时,会先从主存当中读取i的值,然后复制一份到高速缓存当中,然后CPU执行指令对i进行加1操作,然后将数据写入高速缓存,最后将高速缓存中i最新的值刷新到主存当中。