Java内存模型中,程序(进程)拥有一块内存空间,可以被所有的线程共享,即MainMemory(主内存:堆);而每个线程又有一块独立的内存空间,即WorkingMemory(工作内存:栈)。普通情况下,当线程需要对某一共享变量进行修改时,通常会进行如下的过程:
1.从主内存中拷贝变量的一份副本,并装载到工作内存中;2.在工作内存中执行代码,修改副本的值;3.用工作内存中的副本值更新主存中的相关变量值。 所谓“线程安全”,即多个线程同时执行同一段代码时,不会出现不确定的或者与单线程条件下不一致的结果。通常,下列三种条件居其一的并发访问被JVM认为是线程安全的:有final关键字修饰且已被赋值;
有volatile关键字修饰;有锁保护(synchronized、ReentrantLock等)。摘自: https://blog.csdn.net/u014730165/article/details/81981154