ReentrantLock的lock-unlock流程详解

Condition的await-signal流程详解

这里先引入两篇讲的很好的文章,很详细的从源代码解释这两个类。

ReentranLock重入锁实际上内部是引入了一个双向链表,作为一个线程等待队列。

首先新建的ReentranLock和Condition每一个对象都会在内部维护一个链表,作为等待队列,相比较synchronized,ReentranLock用lock()和unlock()将需要上锁的代码块包括起来,建立起来第一层的线程等待队列。

然后可以通过新建Condition再将其中的线程进行分类进行类似于wait,notify的操作(用await,signalAll)。例如生产者消费者模式下,我可以新建两个Condition分别为生产达到上限以及库存不足,在遇到上述两个问题时,调用await,condition会自动将该线程加入其内部维护的等待队列(存在了就不会再添加),在后面调用condition.signalAll时就会进行唤醒。故一个线程要正常工作起码要满足被ReentranLock选择进入工作&&Condition中该线程不是await状态

总结:Condition相对于synchronized提供更细粒度的操作,建立起两层的队列。

KAI 多线程