zoukankan      html  css  js  c++  java
  • AQS深入分析

    一、node概念

    1、当线程获取锁失败时,会被打包成一个node放到同步队列中

     2、node属性

     

     当线程获取锁失败时,会被打包成一个node放到同步队列中,所以node属性中有一个thread属性;

    3、condition中有一个等待队列

     二、同步状态获取和释放源码实现

    for(;;)自旋,编译后比while(true)执行指令少,就一行; 

    1、独占锁同步状态获取和实现

    先尝试拿锁:

     获取不到锁加入等待队列:

    尾节点为空或者被其他线程改了,进入自旋:

     

     自旋中,如果尾节点为空,则把首节点赋值给尾节点,不为空或者后面再判断时不为空,自己加到尾节点后面;

     加入到同步队列中后:

    节点开始在同步队列中自旋,判断自己前面是不是头节点,如果是就开始尝试获取锁:

     

     如果前面不是头节点或者没有获取到锁,则自己进入阻塞状态:

    头节点获取锁执行完之后,释放锁:

     

     释放锁之后唤醒下一个成为头节点的节点中的线程:

     三、condition等待队列

     等待队列和同步队列存放的是结构一样的node节点;
    正常情况下的线程会在同步队列中自旋,尝试获取锁,如果调用了await方法,则从同步队列中加入到等待队列中,阻塞,不再是自旋;

    调用signal方法会从等待队列唤醒,转移到同步队列中,自旋取获取锁;

    四、可重入锁

    调用多次,锁的计数器一直加1,执行完一次就 -1,到0时候就释放锁;

    不然自己占着锁,1 ,就无法原子操作 0->1,自己死锁;

    五、共享锁

    如读锁,可以被多个线程共同访问,status设置为10,拿一个减1,到0为止,释放一个再+1;

    有点类似 Semaphore 工具类,做流控,防止一个资源被访问太多;

  • 相关阅读:
    【刷题】LOJ 6009 「网络流 24 题」软件补丁
    lab 项目
    js内的时间戳指的是当前时间到1970年1月1日00:00:00 UTC对应的毫秒数,和 unix时间戳是对应的秒数,差了1000倍
    js 原生: 身份证脱敏、唯一随机字符串uuid、对于高 index 元素的隐藏与显示
    diy 滚动条 样式 ---- 核心代码
    PC_后台管理系统
    三端兼容项目
    阿里小程序
    到位App_jQuery_art-template
    一步一步 copy163: 网易严选 ---- vue-cli
  • 原文地址:https://www.cnblogs.com/wmqiang/p/11676491.html
Copyright © 2011-2022 走看看