面试题答案
一键面试确保高并发下Integer变量操作线程安全的方法
- 使用
AtomicInteger
:可以直接使用AtomicInteger
来解决高并发下数据不一致和丢失更新问题。AtomicInteger
利用了CAS(Compare - and - Swap)算法,这是一种无锁算法。在对其进行诸如incrementAndGet()
等操作时,会先比较当前值与预期值,如果相等则更新为新值,这个过程是原子性的,不会被其他线程干扰,从而保证了数据的一致性和避免丢失更新。 - 使用
synchronized
关键字:可以在对普通Integer
变量操作的方法或代码块上使用synchronized
关键字。当一个线程进入同步块,会获取对象的锁,其他线程无法同时进入,确保同一时间只有一个线程对变量进行操作,进而保证数据一致性,但这种方式是基于锁机制,相比AtomicInteger
的无锁CAS操作,性能开销更大。
AtomicInteger
与普通Integer
在高并发场景下的区别
- 线程安全性
- AtomicInteger:是线程安全的,内部实现基于CAS算法,在多线程环境下对其进行操作不需要额外的同步机制即可保证数据一致性和原子性。
- 普通
Integer
:本身不是线程安全的,多个线程同时对其进行修改操作时,会出现数据不一致、丢失更新等问题。例如多个线程对同一个Integer
变量进行自增操作,可能最终结果并不是预期的每个线程自增操作的总和。
- 性能
- AtomicInteger:由于采用无锁的CAS操作,在高并发场景下性能通常优于使用锁机制的同步方式。尤其是在竞争不激烈的情况下,能避免线程上下文切换带来的开销。
- 普通
Integer
:若要在高并发场景保证线程安全,需使用synchronized
等同步机制,这会导致线程在竞争锁时频繁的上下文切换,性能开销较大,在高并发场景下性能不如AtomicInteger
。