实现原理是任何一个技术最重要的核心,对于java中aqs的原理小伙伴们了解多少呢?本篇文章小编就为大家讲解讲解。
AQS全称AbstractQueuedSynchronizer是java里各种锁实现的基础,提供了对资源也就是state字段的各种获取与阻塞等待手段,阻塞的线程会被放进一个先进先出(FIFO)的同步队列里。AQS的子类是各种锁,子类必须实现一套用来改变state变量(volatile 修饰的变量)的方法,其中包括锁资源的获取方法与锁资源的释放方法。可以说是volitile和cas操作造就了如今的AQS。
锁中分为排他锁和共享锁两种锁可以说是众所周知的,AQS对锁的获取与释放是分两种情况的,即SHARED与EXCLUSIVE两种模式。如下代码:
EXCLUSIVE模式中锁是必须实现tryAcquire和tryRelease两个抽象方法的,同理,SHARED模式的锁必须实现tryAcquireShared和tryReleaseShared两个抽象方法。这就是AQS为什么是个抽象类而不是接口的原因。
state
AQS锁的核心就是state,即锁资源,该字段是用volatile修饰的。volatile对所修饰的变量主要提供两个功能:一为可见性,二是防止指令重排序。
AQS框架都是对state变量的CAS增减操作,不同的增减方式从而实现了不同性质的锁,如重入锁,在同对象再次重入该锁锁住的资源时,就会对state字段进行加一操作。state字段操作有三个方法:
getState() setState() compareAndSetState()
以上三个方法均是原子操作,其中compareAndSetState的实现依赖于Unsafe的compareAndSwapInt()方法,即
自定义锁方法
自定义锁在每次实现的时候需要自己去实现自己需要的方法。默认情况下不会重写的方法并返回抛出UnsupportedOperationException异常。以下是需要重写的方法:
isHeldExclusively(): 该线程是否正在独占资源。 只有用到condition才需要去实现它。 tryAcquire(int): 独占方式。 尝试获取资源, 成功则返回true, 失败则返回false。 tryRelease(int): 独占方式。 尝试释放资源, 成功则返回true, 失败则返回false。 tryAcquireShared(int): 共享方式。 尝试获取资源。 负数表示失败; 0 表示成功, 但没有剩余可用资源; 正数表示成功, 且有剩余资源。 tryReleaseShared(int): 共享方式。 尝试释放资源, 如果释放后允许唤醒后续等待结点返回true, 否则返回false。
以上就是今天的全部内容,更多有关java常见问题及解决方法的详情请关注本站了解。
推荐阅读: