一道看来很久没看懂要我做什么的题目
ArrayList, LinkedList等都不是线程安全的。多个线程同时在这些对象上进行访问、修改可能会带来同步问题。
尝试解决这个问题。
####裁判程序示例
class SimpleTask implements Runnable {
private final CountDownLatch latch;
private static Random rand = new Random(47);
public SimpleTask(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
try {
TimeUnit.NANOSECONDS.sleep(rand.nextInt(5));
Main.list.add((int)(Math.random()*10));
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main throws InterruptedException{
public static List<Integer> list;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Main.list = /*你的答案*/
/*以下是多个线程频繁在Main.list上增删元素的代码*/
while (sc.hasNextInt()) {
int m = sc.nextInt();
int poolSize = sc.nextInt();
CountDownLatch latch = new CountDownLatch(m);
ExecutorService exec = Executors.newFixedThreadPool(poolSize);
for (int i = 0; i < m; i++) {
exec.execute(new SimpleTask(latch));
}
exec.shutdown();
latch.await();
//这里是一些测试代码,如检验list中元素个数是否正确
Main.list.clear();
}
sc.close();
}
}
答案
Main.list = Collections.synchronizedList(new ArrayList<>());