i++有没有线程安全问题? 为什么? 如何解决它
增操作在多线程环境下可能存在线程安全问题。在高并发情况下,再循环中使用i++时往往会出现些问题,这是由于i++不具备原子性(读取i的值,加1,再写会主存,是三步操作)。为了避免这类问题,我们有三种处理方式:
1.在方法块上加入synchronized关键字,保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,但是如果在读取较多而写入较少时程序效率低下。
2.使用一种“程度较轻的synchronized”,即在变量上加volatile修饰,然而volatile不好把控,使用volatile的代码往往比使用锁的代码更加容易出错。
3.使用autiolnteger,它内部使用了 CAS(Compare-and-Swap)操作来实现原子性,比使用 synchronized关键字更高效。