线程安全性
线程安全性的出现是由于多线程的并发访问引出的问题,首先需要知道多线程的程序是怎样执行的,也就是需要知道jvm模型

可以看到线程之间 局部变量是分别有一份,相互无干扰,但对于堆内存的数据,他们是共享的,所以需要处理这种竞争关系,示意图如下:

还有一个原因: 为了优化程序执行效率,引入了重排序的功能,这个在每个线程执行代码过程中,会对指令进行重新排序,当然了,肯定会确保跟顺序执行一致的结果,但是如果这时候存在和其他程序竞争共享资源的 情况,那么就会出现问题。java内存模型中专门定义了happens-before规则来定义顺序

那么,问题来了,并发关注三个方面问题:原子性、可见性、重排序
- 原子性:我一次执行完,你们都别抢
- 可见性:你们可以抢,我改完,你们都能看到
- 重排序:你们可以抢,我按顺序执行 原子性通过synchronized体现,后二者必须结合通过volatile体现