Цикл while в этом вопросе является потокобезопасным: безопасность потоков AtomicInteger. Если я вставлю метод randomSum в потокобезопасный цикл while, будет ли код по-прежнему потокобезопасным? Или метод 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
, так как вы не изменяли никаких значений вне метода. - person Sachith Dickwella   schedule 09.06.2021random.nextInt
изменяет random внутри, но Random является потокобезопасным. - person rghome   schedule 09.06.2021Random
является потокобезопасным, то из этого следует, что вашrandomSum
является потокобезопасным, посколькуsum
иi
являются локальными переменными и, следовательно, привязаны к потоку. - person Stephen C   schedule 09.06.2021