public class SynTest2 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
//使用Lambda表达式创建线程,重写run方法,将线程名字加入集合list中
//ArrayList为什么不安全?
//如果两个线程同时操作同一个对象,会产生覆盖,因此需要加入锁,创建队列,让线程排队执行
new Thread(()->{
list.add(Thread.currentThread().getName());
}).start();
}
//加入延时让主线程等待多线程执行完必再输出list长度
for (int i = 10; i >= 0; i--) {
try {
Thread.sleep(1000);
System.out.println("倒计时:"+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(list.size());
}
}
03 解决方案(二)
采用JUC并发编程库提供的CopyOnWriteArrayList
import java.util.concurrent.CopyOnWriteArrayList;
public class SynTest3 {
public static void main(String[] args) {
//利用JUC并发编程解决线程不安全问题
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
for (int i = 0; i < 10000; i++) {
new Thread(()->
list.add(Thread.currentThread().getName())
).start();
}
//加入休眠,一来可以放大问题的发生性,二来可以让主线程能够在多线程代码执行完毕后再去执行下一段代码
for (int i = 5; i >= 0; i--) {
System.out.println("倒计时:"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(list.size());
}
}