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组合在自定义同步组件得实现中,并调用其模板方法,而这些模板方法会调用使用者得重写方法。

  • 相关阅读:
    使用FRP让内网站点被外网访问
    游戏AI(三)—行为树优化之基于事件的行为树
    游戏AI(二)—行为树优化之内存优化
    游戏AI-行为树理论及实现
    利用InfluxDB和Grafana搭建一个数据监测的仪表盘
    Go语言中slice使用注意事项
    4:ELK分析tomcat日志
    2:tomcat配置优化
    文件操作2-Day3
    MySQL读写分离项目配置
  • 原文地址:https://www.cnblogs.com/ffdsj/p/12399190.html
Copyright © 2011-2022 走看看