3-1 i++是否线程安全?如果不安全,怎么解决?
在Java中,i++并不具备原子性,这是因为它相当于i = i+1,也就是说它是个复合操作,主要分为3个步骤:
1. 读值,从内存读到寄存器。
2. 加1,在寄存器中加1。
3. 写值,写回内存。
如果它是方法里定义的,那它线程就是安全的,因为Java中方法栈私有,否则,它就可能存在线程安全问题。
解决的方案有很多,我了解的大约有以下几种。
1. 原子变量AtomicInteger,即所有的操作都是原子性的。
2. sychronized和lock这些Java中的锁。
AtomicInteger 和 各种 Lock 都可以确保线程安全。AtomicInteger 的效率高是因为它是互斥区非常小,只有一条指令,而 Lock 的互斥区是拿锁到放锁之间的区域,至少三条指令。