ReentrantLock源码分析
ReentrantLock是一个可重入且独占式的锁,该锁支持获取锁时的公平和非公平选择。
公平锁公平锁遵循FIFO的原则,所有的线程都会顺序执行
获取锁123456789101112 //加锁 final void lock() { acquire(1); }//调用AbstractQueuedSynchronizer public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); }
是否是获得锁,还是进入队列等待的逻辑在tryAcquire 函数里。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647protected final boolean tryAcquire(in ...
AbstractQueuedSynchronizer源码分析-独占式
独占式获得锁独占式下的顶层函数为acquire(),首先调用tryAcquire()函数获得锁,如果获取不到锁,则将线程加入到队列中。
1234567public final void acquire(int arg) { if (!tryAcquire(arg) && //尝试获得锁 //将线程加入到对列中,循环获取资源,并在一定次数后阻塞 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) //在阻塞过程中线程可能被中断,忽略中断,在获取到锁后再进行中断。 selfInterrupt();}
addWaiter()将线程加入到阻塞队列中。
12345678910111213141516private Node addWaiter(Node mode) { //将建一个队列节点,并设置该节点为独占模式 Node node = new Node(Thread.currentThread(), mode); // 尝试快速插入 ...
AbstractQueuedSynchronizer源码分析-共享式
共享式获得锁共享式获取锁的顶层函数为acquireShared(),该函数首先调用tryAcquireShared()尝试互锁,如果获取不到锁,则将该线程加入到队列中。
1234567public final void acquireShared(int arg) { //尝试获取锁 //小于0,代表获取锁失败 // 具体的逻辑由子类实现 if (tryAcquireShared(arg) < 0) doAcquireShared(arg); }
doAcquireShared()函数将该线程加入到队列中,然后通过有限次的循环获取锁,并判断是否该阻塞
12345678910111213141516171819202122232425262728293031323334353637383940private void doAcquireShared(int arg) { //将该线程加入到队列中 final Node node = addWait ...