跳到主要内容

怎么实现一个线程安全的计数器 ?

参考答案:

在Java中,你可以使用AtomicInteger类来实现一个线程安全的计数器。AtomicInteger是Java并发包java.util.concurrent.atomic中的一个类,它提供了原子操作来更新整数值,从而确保线程安全。

以下是一个使用AtomicInteger实现线程安全计数器的示例:

import java.util.concurrent.atomic.AtomicInteger;

public class ThreadSafeCounter {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }

    public static void main(String[] args) {
        ThreadSafeCounter counter = new ThreadSafeCounter();

        // 创建多个线程来测试计数器的线程安全性
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    counter.increment();
                }
            }).start();
        }

        // 等待所有线程完成
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 输出最终的计数器值
        System.out.println("Final count: " + counter.getCount());
    }
}

在这个示例中,ThreadSafeCounter类包含一个AtomicInteger类型的count字段,用于存储计数器的值。increment()方法使用AtomicIntegerincrementAndGet()方法来原子地增加计数器的值。getCount()方法返回当前计数器的值。

main()方法中,我们创建了一个ThreadSafeCounter对象,并启动多个线程来同时增加计数器的值。由于使用了AtomicInteger,计数器在多个线程之间的操作是线程安全的。最后,我们等待所有线程完成并输出最终的计数器值。

请注意,虽然这个示例展示了如何使用AtomicInteger来实现线程安全的计数器,但在实际的生产环境中,你还需要考虑其他因素,如计数器的初始值、最大值、溢出处理等。