synchronized的作用是给对象加锁,防止多个线程同时访问这个对象的方法。
concurrent包下面的锁的种类
接口:Lock,ReadwriteLock,condition
实现类:ReentrantLock,ReentrantReadWriteLock,StampedLock
抽象类:AbstractQueuedSynchronizer
AbstractQueuedSynchronizer(AQS)抽象队列同步器
定义两种资源共享方式:Exclusive(独占,只有一个线程能执行,如:ReentrantLock)和share(共享,多个线程可同时执行,如:Semphore,CountDownLatch)
不同的自定义同步器争用共享资源的方式也不同,自定义同步器在实现时只需要实现共享资源state的获取与释放即可,至于具体线程等待队列的维护(如:获取资源失败入队 / 唤醒出队等)AQS已经在顶层实现好了。
以ReentrantLock为例,state初始化为0,表示未锁定状态,A线程Lock()时会调用tryAcquire()独占该锁并将state +1,此后,其他线程再tryAcquire()时就会失败,知道A线程unlock()到state=0(即释放锁)为止,其他线程才有机会获取锁,当然,释放锁之前,A线程自己可以重复获取此锁(state会累加)就是可重入的概念,但是要注意获取多少次就要释放多少次,这样才能保证s