zoukankan      html  css  js  c++  java
  • 程序员谈话系列——————解开AQS的神秘面纱

    一,谈一谈什么是AQS

    AQS是一个用来创建锁和同步器的框架,使用AQS能够简单且高效的构造出应用广泛的大量的同步器,比如常用的ReentrantLock,Semaphore‘,其他的诸如ReentrantReadWriteLock,FutureTask等等皆是基于AQS非常轻松容易的构造出符合我们自己需求的同步器。

    二,AQS原理分析

    AQS核心思想是,如果被请求的共享资源空闲,那么将请求资源的线程设置为有效线程,并且将共享资源设为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待已经被唤醒时锁分配的机制,这个机制时AQS通过CLH队列实现的,将暂时获取步到锁的线程加入到队列当中。CLH队列时一个虚拟的双向队列,即不存在队列实例,仅存在结点之间的关联关系。AQS将每条请求资源的线程封装成CLH锁队列的一个节点,从而实现锁的分配。

    AQS使用一个int成员变量来表示同步状态,通过内置的FIFO队列来完成排队工作,AQS使用CAS对该同步状态进行原子操作实现对值得修改。

    三,AQS对资源得共享方式

    1,Exclusive(独占):只有一个线程能执行,如ReentrantLock,公平锁和非公平锁。

    2,share(共享),多个线程可以同时执行,比如信号量 Semaphore栅栏 CyclicBarrier闭锁 CountDownLatch等等。

    四,AQS底层使用了模板方法模式

    要自定一个AQS首先要继承AbstractQueueSynchronizer并重写制定的方法,无非就是对state得获取和释放。

    然后将AQS组合在自定义同步组件得实现中,并调用其模板方法,而这些模板方法会调用使用者得重写方法。

  • 相关阅读:
    vue.js 第二课
    vue.js学习(第一课)
    2016-11-14看张大神的微博总结
    这几天的工作总结:
    调了一天的兼容总结下
    鸭式辩论
    prototype 原型
    前端ps常用的小技巧
    Android的开始之相对布局
    Android的开始之线性布局
  • 原文地址:https://www.cnblogs.com/ffdsj/p/12399190.html
Copyright © 2011-2022 走看看