CountDownLatch (https://www.jianshu.com/p/f17692e9114f)
ArrayList非线程安全,Vector为线程安全
非线程安全 != 不安全,只能说多个线程操作同一个对象时不安全
package test;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class MyThread implements Runnable{
private List list;
private CountDownLatch countDownLatch;
public MyThread(List list,CountDownLatch countDownLatch){
this.list=list;
this.countDownLatch=countDownLatch;
}
@Override
public void run() {
for(int i=0;i<100;i++){
list.add(new Object());
}
countDownLatch.countDown();
}
}
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.CountDownLatch;
public class B {
public static void main(String[] args) throws InterruptedException {
List<Object> list=new ArrayList<>();
// List<Object> list=new Vector<>();
int threadCount = 1000;
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
for(int i=0;i<threadCount;i++){
Thread thread= new Thread(new MyThread(list,countDownLatch));
thread.start();
}
countDownLatch.await();
System.out.println(list.size());
}
}
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class B {
public static void main(String[] args){
// ExecutorService pool= Executors.newFixedThreadPool(2);
ExecutorService pool= Executors.newCachedThreadPool();
Thread t1 = new Thread(new MyThread());
Thread t2 = new Thread(new MyThread());
Thread t3 = new Thread(new MyThread());
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.shutdown();
}
}