MST

星途 面试题库

面试题:Java并发编程之线程安全问题

在Java中,假设有一个共享变量`count`,多个线程同时对其进行自增操作。请分析以下代码是否线程安全,并说明原因。如果不安全,应该如何修改来保证线程安全? ```java public class Counter { private int count = 0; public void increment() { count++; } public int getCount() { return count; } } ```
47.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

分析

这段代码不是线程安全的。原因是count++操作并非原子性的,它实际上包含了读取count的值、增加1、再将新值写回count这三个步骤。在多线程环境下,当一个线程执行这三个步骤的过程中,其他线程可能也在执行相同操作,从而导致数据竞争,使得最终的count值不准确。

修改方法

  1. 使用synchronized关键字
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

在上述代码中,通过synchronized关键字修饰incrementgetCount方法,确保在同一时刻只有一个线程能够访问这些方法,从而避免数据竞争。

  1. 使用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关键字,性能相对更好。