zoukankan      html  css  js  c++  java
  • JAVA多线程之AQS

    一、AQS的核心思想

    AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。

    二、实现原理

    1、private volatile int state:AQS使用一个int成员变量来表示同步状态,通过内置的FIFO队列来完成获取资源线程的排队工作。AQS使用CAS对该同步状态进行原子操作实现对其值的修改。

       //获取状态
        protected final int getState() {
            return state;
        }
       //设置状态值
        protected final void setState(int newState) {
            state = newState;
        }
       //通过CAS修改状态
        protected final boolean compareAndSetState(int expect, int update) {
            // See below for intrinsics setup to support this
            return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
        }

    在ReentrantLock中,stste表示获取锁的线程数,假如state=0,表示还没有线程获取锁,1表示有线程获取了锁。大于1表示重入锁的数量。

    2、CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系)。AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一个结点(Node)来实现锁的分配。

    三、ReentrantLock中的公平锁与非公平锁

     公平锁:当前线程在抢锁之前先看看队列中是否有排队的线程,如果有则不允许抢,直接加入队列。

    非公平锁:当前线程在抢锁之前不需要查看队列中是否有排队的线程。

    古之学者为己,今之学者为人
  • 相关阅读:
    ubuntu上如何安装和卸载google chrome 浏览器
    另眼相看“那些争议最大的编程观点”
    读完了csapp(中文名:深入理解计算机系统)
    SSL工作原理
    linux signal 处理
    PCB设计资料:看到最后才知道是福利
    String.Format使用方法
    matlab三维画图
    spin_lock & mutex_lock的差别?
    Hibernate Criterion
  • 原文地址:https://www.cnblogs.com/jalja365/p/14750622.html
Copyright © 2011-2022 走看看