面试题答案
一键面试分析
这段代码不是线程安全的。原因是count++
操作并非原子性的,它实际上包含了读取count
的值、增加1、再将新值写回count
这三个步骤。在多线程环境下,当一个线程执行这三个步骤的过程中,其他线程可能也在执行相同操作,从而导致数据竞争,使得最终的count
值不准确。
修改方法
- 使用
synchronized
关键字:
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
在上述代码中,通过synchronized
关键字修饰increment
和getCount
方法,确保在同一时刻只有一个线程能够访问这些方法,从而避免数据竞争。
- 使用
AtomicInteger
:
import java.util.concurrent.atomic.AtomicInteger;
public class Counter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
AtomicInteger
类提供了原子性的自增操作incrementAndGet
,它内部使用了CAS(Compare and Swap)算法来保证在多线程环境下的原子性,无需使用synchronized
关键字,性能相对更好。