Skip to content

面试速答(先看这里)

**一句话结论:**在并发编程中,我们能用到的并发工具无非就是synchronized,volatile,reentrantLock以及并发工具类如AtomicInteger等。

60秒标准回答:

想要保证多线程情况下,i++的正确性,需要考虑可见性、原子性及有序性

在并发编程中,我们能用到的并发工具无非就是synchronized,volatile,reentrantLock以及并发工具类如AtomicInteger等

这里面,除了volatile不可以以外(因为他没办法保证原子性),其他几种方式都可以

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**想要保证多线程情况下,i++的正确性,需要考虑可见性、原子性及有序性。
  • **要点2:**这里面,除了volatile不可以以外(因为他没办法保证原子性),其他几种方式都可以。
  • **要点3:**使用 AtomicInteger 类:

**记忆锚点:**reentrantLock → AtomicInteger → synchronized → volatile → i++ → 我们能用到的并发

追问准备:

  • 围绕「reentrantLock」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「AtomicInteger」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「synchronized」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

想要保证多线程情况下,i++的正确性,需要考虑可见性、原子性及有序性。

在并发编程中,我们能用到的并发工具无非就是synchronized,volatile,reentrantLock以及并发工具类如AtomicInteger等。

这里面,除了volatile不可以以外(因为他没办法保证原子性),其他几种方式都可以。

📄 ✅volatile能保证原子性吗?为什么?

打开文档:✅volatile能保证原子性吗?为什么?

使用 AtomicInteger 类:

java
private static AtomicInteger i = new AtomicInteger(0);

public static void increment() {
    i.incrementAndGet();
}

使用synchronized:

java
public class HollisTest{
    private static int i = 0;

    public void increment() {
        synchronized (HollisTest.class) {
            i++;
        }
    }
}

使用reentrantLock:

java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class HollisTest {
    private int i = 0;
    private Lock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            i++;
        } finally {
            lock.unlock();
        }
    }
}