CountDownLatch是什么?
CountDownLatch是一个发令枪,并发控制器,可以阻塞线程,使一个线程等待其他线程执行完再去执行
原理:
CountDownLatch是JUC包中的一员,将阻塞里的线程都封装成一个Node节点 加入到AQS队列中,使用的是一个共享锁
当调用countDownLatch.await()方法时,都会将当前线程加入到这个AQS队列中,AQS队列的作用是存放需要获取锁的线程,利用的是一个state状态 去管理锁的状态的
秒杀小例子
//使用AtomicInteger来处理事务
static AtomicInteger ticket = new AtomicInteger(100);
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(1);
for (int i = 0; i < 201; i++) {
new Thread(new SecondsKillRunnable(countDownLatch),"线程_"+i).start();
}
Thread.sleep(1000);
countDownLatch.countDown();
}
public static class SecondsKillRunnable implements Runnable{
CountDownLatch countDownLatch;
public SecondsKillRunnable(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(ticket.get()>0){
int remainingTicket = ticket.getAndDecrement();
System.out.println("Thread:"+Thread.currentThread().getName()+",剩余票数:"+remainingTicket);
}else{
System.out.println("Thread:"+Thread.currentThread().getName()+",没票了");
}
}
}