1 原因
-
线程在操作系统中随机调度,抢占式执行
-
多个线程同时修改同一个变量
-
修改操作,不是”原子“的。原子是指在cpu视角不可分割的最小单位:一条指令。
-
内存可见性问题
-
指令重排序
2 解决方案
-
针对第三个原因,把”非原子“的修改变成”原子“
-
java中提供了synchronized关键字,来完成加锁操作
-
synchronized (locker) 锁任意对象
-
synchronized (this) 锁当前对象
-
()内为锁定的对象
-
{}里的就是要打包到一起的代码
-
本质是把随机的并发执行过程强制变成串行
-
synchronized是JVM提供的功能,通过c++代码实现,进一步的依靠操作系统api实现的加锁。操作系统api来自于cpu上支持的特殊指令实现的。
-
锁对象就是this
-
static给类对象加锁
-
死锁
-
一个线程针对一把锁连续加锁两次
-
-