ReentranceLock 和 Semaphore有很多共同点,他们都像是一个gate一样, 来控制让哪些线程阻塞,让哪些线程通过. 不同的是,ReentranceLock允许通过的量是1,Semaphore允许多个线程通过, 所以在这个角度看,ReentranceLock和Semaphore是可以相互实现的. 另外他们还提供了公平或非公平的竞争,超时等等特性
他们都是由AQS作为基类来实现的.AQS is a framework for building locks and synchronizers, and a surprisingly broad range of
synchronizers can be built easily and efficiently using it. Not only are ReentrantLock and Semaphore built using AQS,
but so are CountDownLatch , ReentrantReadWriteLock , SynchronousQueue , [12] and FutureTask .
使用AQS而不是其他的锁或同步器来实现新的锁, 因为AQS提供了很多好处: 1.省去了很多精力 2.我们在使用别的同步器的来实现新的同步器的时候,很可能为了获取一次锁而实际产生多次获取锁的操作,而造成了额外的线程切换. 比如,我们在锁的内部使用了wait,这种情况下,为了一次获取锁,实际进行了俩次锁的获取操作.而如果使用AQS的话,只会有一次获取锁的操作, AQS就是为了更好的扩展性才设计的