CountDownLatch这个类,这个工具可以让我们的线程在一开始都处于“同一起跑线”
代码:
public class hacker_01_CountDownLatchDemo {
final List<Integer> datas= new ArrayList<>();
final ExecutorService TASK_POOL= Executors.newFixedThreadPool(20);
final CountDownLatch cdl=new CountDownLatch(20);
public static void main(String[] args) throws InterruptedException {
hacker_01_CountDownLatchDemo countdownlatch= new hacker_01_CountDownLatchDemo();
countdownlatch.doTestCountDownLatch();
}
public void doTestCountDownLatch() throws InterruptedException {
Runnable task=()->{
try {
// 等待,主动让出cup
cdl.await();
for (int i = 0; i < 100; i++) {
datas.add(i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
};
// 循环20个线程进行执行操作
for (int i = 0; i <20 ; i++) {
TASK_POOL.execute(task);
// 计数-1
cdl.countDown();
}
TASK_POOL.shutdown();
TASK_POOL.awaitTermination(5, TimeUnit.SECONDS);
System.out.println(datas.size());
}
}
结果:
结论: 20个线程往ArrayList里面增加数据,每个线程增加100个,最后输出这个集合的长度;如果这个类是线程安全的,最后的结果应该是2000,但是ArrayList并非线程安全,结果应该是小于2000或出现下标越界。