美文网首页
java并发编程

java并发编程

作者: Solace_0e71 | 来源:发表于2020-07-16 10:43 被阅读0次

    1、AQS

    AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。
    AQS继承AbstractOwnableSynchronizer,AbstractOwnableSynchronizer设置当前线程的独占拥有者。
    AQS state字段是volatile类型的int值,作为lock的记录值,在ReentrantLock中如果判断当前线程持有锁,则返回获取锁成功,并且state数值加1
    ReentrantLock是可重入锁,支持公平锁和非公平锁,底层由AQS实现,两者是怎么关联起来的呢?定义Sync类继承AQS实现抽象类。在ReentrantLock中定义公平锁和非公平锁都是继承Sync类。
    独占锁通过CAS设置state状态成功,获取独占锁;若设置失败,进入Acquire方法进行后续处理。如果获取锁失败会进行排队等候,排队等候就会用到队列结构,队列结构实现是在AQS中实现,类似自旋锁队列结构,是双向链表,通过定义Node节点保存排队的线程以及队列的前后节点。在acquire时候会尝试获取锁,如果获取失败就会通过addWaiter生成node节点,并且设置为tail节点,判断node节点是否在head节点之后,如果是那么就自旋等待获取锁;如果不是,就将当前节点加入到等待队列中,并且调用LockSupport.park挂起当前线程,阻塞调用栈,返回当前线程的中断状态。
    如何解锁?
    unlock -> sync.release(1);
    release释放锁,减少可重入次数,如果state=0了,那就释放锁,同事将等待队列从后往前找到待激活的线程,解挂激活线程来获取锁结构。

    CountDownLatch和CyclicBarrier能够实现线程之间的等待,CountDownLatch是等线程都达到某种状态,CyclicBarrier是用于一组线程都等待到某个状态,然后这一组线程同时执行,CyclicBarrier是可以重用的,这组线程用完了,下组还能用。
    Semaphore和锁有点类似,用于控制对某组资源的访问权限。

    相关文章

      网友评论

          本文标题:java并发编程

          本文链接:https://www.haomeiwen.com/subject/gtxphktx.html