Ann*_*ier 1 java thread-safety atomicinteger
这个问题中的 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();
}
}
Run Code Online (Sandbox Code Playgroud)
该方法randomSum是线程安全的,就像它的使用一样。
唯一的共享对象是random. Java API 文档指出, 的实例java.util.Random是线程安全的,但如果同时使用(大概是由于同步)可能会遇到性能问题,如果性能有问题,ThreadLocalRandom则应考虑这一点。
| 归档时间: |
|
| 查看次数: |
33 次 |
| 最近记录: |