,之所以会这样是因为count++操作不是原子的,具体什么原子性以及如何解决,请看下文。...线程不安全的原因
多个线程同时修改同一个共享数据,如上述代码修改堆上的count
操作系统对于线程的调度是抢占式的
修改操作不是原子的
内存可见性问题
指令重排序
原子性
原子操作是不能被线程调度机制中断的操作...其原因是因为 线程调度是随机的,造成了线程自增操作的指令集交叉,从而导致实际值小于预期值,至于为啥会造成指令集交叉又因为count++这个操作不是原子的,不是原子意味着不是一气呵成的,而是由三步操作完成...那么就只能将不是原子性的操作打包成一个原子性的操作,这样无论线程如何随机的调度,都不会出现bug,至于如何打包,就得通过加锁来解决。...这个排队并不是真正意义上的按顺序来,在操作系统内部会维护一个等待队列,当这个锁被某个线程占有的时候,其他线程尝试进行加锁,就加不上,就会阻塞等待,一直等待之前占有锁的线程解锁之后,由操作系统唤醒一个新的线程