上次博客我们主要说了我们juc并发包下面的ReetrantLock的一些简单使用和底层的原理,是如何实现公平锁、非公平锁的。内部的双向链表到底是什么意思,prev和next到底是什么,为什么要引入heap和tail来值向null的Node节点。高并发时候是如何保证state来记录重入锁的,在我们的上次博客都做了详细的说明。这次我们来聊一些简单易懂且实用的AQS中的工具类。
Semaphore信号量:
这个东西很简单,别看字面意思,什么信号量,我也不懂得那个术语什么意思,Semaphore你可以这样来理解,我们要去看电影,而且是3D电影(必须戴3D眼镜才可以进入),但是比较不巧的是我们电影院只有两个3D眼镜了,也就是说,我们每次只能进去两个人看电影,然后等待这两个人看完电影以后把眼镜还回来,后面的两个人才能继续观看,就是说每次只允许最多进去两个人,每次进入到线程获取锁,需要你得到前置的票据,才可以进行后续的流程。可以理解为一个简单的限流吧。我们来一下代码示例。
public class Test { public static void main(String[] args) throws InterruptedException { Semaphore semaphore = new Semaphore(2); for (int i = 0; i < 5; i++) { new Thread(new Task(semaphore,"xiaocaijishu"+i)).start(); } } static class Task extends Thread{ Semaphore semaphore; public Task(Semaphore semaphore,String tname){ this.semaphore = semaphore; this.setName(tname); } public void run() { try { semaphore.acquire(); System.out.println(Thread.currentThread().getName()+"拿着3D眼镜进去了,时间是"+System.currentTimeMillis()); Thread.sleep(1000); semaphore.release(); System.out.println(Thread.currentThread().getName()+"出来了,将3D眼镜还给了服务人员,时间是"+System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } } }