JUC理解-AQS抽象队列同步器
AbstractQueuedSynchronizer特点 1.AQS可以实现独有锁和共享锁。 2.独有锁exclusive是一个气馁锁。担保只有一个线程颠末一个阻塞点,只有一个线程可以得到锁。 3.共享锁shared是一个乐观锁。可以应承多个线程阻塞点,可以多个线程同时获取到锁。它应承一个资源可以被多个读操纵,可能被一个写操纵会见,可是两个操纵不能同时会见。 4.AQS行使一个int范例的成员变量state来暗示同步状态,当state>0时暗示已经获取了锁,当state = 0无锁。它提供了三个要领(getState()、setState(int newState)、compareAndSetState(int expect,int update))来对同步状态state举办操纵,可以确保对state的操纵是安详的。 5.AQS是通过一个CLH行列实现的(CLH锁即Craig, Landin, and Hagersten (CLH) locks,CLH锁是一个自旋锁,能确保无饥饿性,提供先来先处事的公正性。CLH锁也是一种基于链表的可扩展、高机能、公正的自旋锁,申请线程只在当地变量上自旋,它不绝轮询前驱的状态,假如发明前驱开释了锁就竣事自旋。) 抽象 我们来扒一扒源码可以看到它担任于AbstractOwnableSynchronizer它是一个抽象类. public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable AQS内部行使了一个volatile的变量state来作为资源的标识。同时界说了几个获取和改变state的protected要领,子类可以包围这些要领来实现本身的逻辑. 可以看到类中为我们提供了几个protected级此外要领,它们别离是: //建设一个行列同步器实例,初始state是0 protected AbstractQueuedSynchronizer() { }
//返回同步状态的当前值。 protected final int getState() { return state; }
//配置同步状态的值 protected final void setState(int newState) { state = newState; }
//独有方法。实行获取资源,乐成则返回true,失败则返回false。 protected boolean tryAcquire(int arg) { throw new UnsupportedOperationException(); }
//独有方法。实行开释资源,乐成则返回true,失败则返回false。 protected boolean tryRelease(int arg) { throw new UnsupportedOperationException(); }
//共享方法。实行获取资源。负数暗示失败;0暗示乐成,但没有剩余可用资源;正数暗示乐成,且有剩余资源 protected int tryAcquireShared(int arg) { throw new UnsupportedOperationException(); }
//共享方法。实行开释资源,假如开释后应承叫醒后续守候结点返回true,不然返回false。 protected boolean tryReleaseShared(int arg) { throw new UnsupportedOperationException(); }
这些要领固然都是protected要领,可是它们并没有在AQS详细实现,而是直接抛出非常,AQS实现了一系列首要的逻辑 由此可知,AQS是一个抽象的用于构建锁和同步器的框架,行使AQS能简朴且高效地结构出应用普及的同步器,好比我们提到的ReentrantLock,Semaphore,ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |