Java 并发编程之AbstractQueuedSynchronizer解析

一、队列同步器的使用:
  队列同步器AbstractQueuedSynchronizer,它是一个用来构建锁或者其它同步组件的基础框架,其中内部使用一个int值来代表同步状态,使用的是FIFO的形式,所以被称为队列同步器,此同步器作者希望它能实现大部分的同步需求。
  使用此同步器的方法一般是继承此同步器,然后实现内部的抽象方法,其中几个方法比较重要:

  1、getState() : 
获取队列同步器中的int状态值(不是内部node的状态,而是整个队列同步器的状态值),注意这个状态值比较重要,可以使用它来实现排他锁与共享锁

  2、compareAndSetState(int expect, int update):
设置状态,当队列同步器中的int状态值为 expect 的时候将其状态设置为 update,注意这个方法是线程安全的。也就是说是原子的方法。我们可以使用这个方法来设置队列同步器中的int状态值。


  3、boolean tryAcquire(int arg):
此方法很重要,为排他式的获取到锁,即同一个时间只有一个线程能获取到锁,如果其它线程已经获取到锁,那么这个线程将会排队阻塞,直到轮到它来获取到锁。所以我们在实现这个方法的时候,必须要保证如果返回true,那么说明他获取到排他锁,否则直接返回false。


  4、boolean tryRelease(int arg):
获取到排他锁的线程来释放的方法,当一个线程获取到锁之后,开始执行自己的任务,执行完成后,需要调用此方法进行释放。所以我们在实现这个方法的时候需要保证如果返回true,那么现在队列同步器中的int状态值应该置为初始值。

  5、int tryAcquireShared(int arg):
共享式的获取到锁,共享锁是指如果此锁处于共享状态,那么其它线程是可以获取到它的共享锁的,而其它线程是获取不到它的排他锁的。而如果其它线程获取到了它的排他锁,那么其它线程既不能获取到它的排他锁,也不能获取到它的共享锁。
所以实现此方法需要保证现在的状态允许其获取到共享锁。(其实我认为一个同步器应该实现一个功能,如果要实现共享锁,那么上面的tryAcquire、tryRelease直接不实现即可,如果调用上面的tryAcquire、tryRelease方法,AbstractQueuedSynchronizer会直接报错 )。

 6、boolean tryReleaseShared(int arg):
共享式的释放锁,当线程获取到共享锁之后,可以调用此方法来释放共享锁。
 

二、使用AbstractQueuedSynchronizer来实现排他锁:

  1、同一时间只允许有一个线程lock的锁:

public class ExclusiveLock implements Lock{

    public static class ExclusiveSync extends AbstractQueuedSynchronizer {

        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值