首先如果是局部变量,那么i++是线程安全。
如果是全局变量,那么i++不是线程安全的。
理由:如果是局部变量,那么i++是线程安全:局部变量其他线程访问不到,所以根本不存在是否安全这个问题。
如果是全局变量,那么i++不是线程安全的:当它是全局变量时,所有线程都可以访问,所以,出现不安全性。
从更底层的角度讲,主要是因为i++这个操作不是原子性的,这个会编译成count = count +1; 所以会出现多线程访问冲突问题。volatile虽然可以保证多线程对修改可见,但代码中用到了
count++, 主要是count++不是原子性操作,这个会编译成count = count +1,其实是做了3个步骤,一个是读取,修改,写入 。所以会出现多线程访问冲突问题
解决方案:
1,加同步锁,比如使用synchronized关键字修饰,保证只有一个线程可以对主存变量进行操作
2,使用Atomic*类修饰来保证原子性。