最近在测试
LinkedBlockingQueue和LinkList的线程安全问题,
即创建100个线程,每个线程往队列里面塞1000个值,当结束时查看当前线程的size,看size是否与对接真是数量相当。
但是主线程无法知道什么时候其他所有线程啥时候执行完毕。
所以采用CountDownLatch的方式执行。
countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
- countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
- 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。
package com.example.demo.test.imp;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingQueue;
public class Test13 {
public static void main(String[] args) throws InterruptedException {
// List<Integer> list = new LinkedList<>();
CountDownLatch latch = new CountDownLatch(100);
List<Thread> list2 = new LinkedList<>();
Queue<Integer> list = new LinkedBlockingQueue<>();
for (int i = 0; i < 100; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000; i++)
list.add(1);
latch.countDown();
}
});
thread.start();
list2.add(thread);
}
latch.await();
System.out.println(list.size());
System.out.println(list);
}
}
当执行至latch.await()的时候,主线程等待计数器为0时才向下执行
当调用latch.countDown()时计数器的值就-1
测试结果正确
LinkedBlocking Queue size 100000
LinkList size 99148