这个问题中的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();
}
}发布于 2021-06-09 14:31:19
randomSum方法是线程安全的,它的使用也是如此。
唯一的共享对象是random。Java API文档指出,java.util.Random的实例是线程安全的,但如果并发使用(可能是由于同步),则可能会遇到性能问题,如果性能有问题,则应考虑使用ThreadLocalRandom。
https://stackoverflow.com/questions/67898577
复制相似问题