如果循环是线程安全的,则线程安全

问题描述

这个问题中的 while 循环是线程安全的:AtomicInteger thread safety。如果我在线程安全的 while 循环中插入 randomSum 方法代码是否仍然是线程安全的?还是应该同步randomSum方法

import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;

public class Print implements Runnable {
    static AtomicInteger atomicInteger = new AtomicInteger(0);
    static Random random = new Random(1);

    public static int randomSum() {
        int sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += random.nextInt();
        }
        return sum;
    }

    @Override
    public void run() {
        while (atomicInteger.getAndIncrement() < 100)
            System.out.println(randomSum() + " " + Thread.currentThread());
    }

    public static void main(String[] args) throws InterruptedException {
        ArrayList<Thread> threads = new ArrayList<>();

        for (int i = 0; i < 5; i++)
            threads.add(new Thread(new Print()));

        for (Thread thread : threads)
            thread.start();

        for (Thread thread : threads)
            thread.join();
    }
}

解决方法

方法 randomSum 是线程安全的,它的用途也是如此。

唯一的共享对象是 random。 Java API 文档指出 java.util.Random 的实例是线程安全的,但如果同时使用(大概是由于同步)可能会遇到性能问题,如果性能有问题,则应考虑 ThreadLocalRandom。>