1.信号量内部有一个Sync类,继承了AQS抽象队列同步器
2.sync类还有2个子类,一个公平锁,一个非公平锁,默认是非公平锁
3.new对象的时候,会设置好凭证(计数器),当凭证为0的时候,就一直阻塞
4.在加锁的时候,会通过cas去抢锁,抢到,计数器减去1
5.如果抢不到,加入队列,这个队列就是由AQS中node节点构成的双向链表组成的同步等待队列
6.如果队列不存在,那么先创建队列
7.如果队列存在,那么把节点直接入队,并修改节点状态为可唤醒的状态-1
8.然后调用park方法进行阻塞
9.在释放锁的时候,把计数器加1,修改节点的状态为0 (初始状态)
10.调用unpark方法进行唤醒阻塞的线程