范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

一文带你深入理解AQS

  AQS
  队列同步器AbstractQueuedSynchronizer,用来构建锁或者其他同步组件的基础框架,内部使用一个变量state来表示同步状态,同时使用一个FIFO队列来完成线程的排队工作。
  锁或者其他同步组件一般都会定义一个静态内部类,该静态内部类会继承AQS,同时  重写  AQS中的方法,重写AQS中的方法时需要用到下面三个方法来获取同步状态。  getState()
  获取state属性的内容。  setState(int newState)
  设置state属性的内容。  compareAndSetState(int expect, int update)
  使用CAS设置当前状态,保证状态设置的原子性。
  总结:如何自定义一个锁或者同步组件?
  创建静态内部类继承AQS,重写AQS中的  可重写  的方法,在里面使用AQS提供的如上三个方法来获取、修改同步状态。最后调用AQS中的模板方法来进行操作,模板方法中会调用重写的方法。
  即使用者调用模板方法,模板方法调用重写方法,重写方法调用如上三个方法。
  可重写的方法
  protected boolean tryAcquire(int arg);
  独占式获取 同步状态,查询当前状态并根据具体条件设置同步状态。
  protected boolean tryRelease(int arg);
  独占式释放 同步状态,等待的线程有机会获取同步状态。
  protected int tryAcquireShared(int arg);
  共享式获取 同步状态,返回大于等于0的值表示获取成功,反之获取失败。
  4. protected boolean tryReleaseShared(int arg);
  共享式释放 同步状态。
  5. protected boolean isHeldExclusively();
  表示是否被当前线程占用。 模板方法独占式获取同步状态
  当前线程获取成功则会返回,否则进入同步队列 等待 ,调用重写方法中的 tryAcquire 。
  2. 独占式获取同步状态,响应中断 void acquireInterruptible(int arg);
  如果当前线程被中断,则会抛出InterruptedException。 超时获取同步状态 boolean tryAcquireNanos(int arg, long nanos);
  在acquireInterruptible的基础上设置超时时间,如果超时时间还没有获取到同步状态,会返回false,否则返回true。 4. 共享获取同步状态 void acquireShared(int arg); 共享获取同步状态,响应中断 void acquireSharedInterruptible(int arg); 共享获取同步状态,响应中断,添加超时时间 boolean tryAcquireSharedNanos(int arg, long nanos); 独占式释放同步状态 boolean release(int arg);
  同步队列中的第一个节点将会被唤醒。 8. 共享式释放同步状态 boolean releaseShared(int arg); 获取等待在同步队列上的线程集合 Collection getQueuedThreads();
  总之:模板可以分为三类:独占式获取与释放同步状态、共享式获取与释放同步状态、查询同步队列线程等待情况。获取又有分为中断、超时。 自定义同步组件 public class UnReetrantLock implements Lock {           public static class Sync extends AbstractQueuedSynchronizer {                  @Override         protected boolean tryAcquire(int arg) {             if (compareAndSetState(0, 1)) {                                                     setExclusiveOwnerThread(Thread.currentThread());                 return true;             }             return false;         }                   @Override         protected boolean tryRelease(int arg) {                          setExclusiveOwnerThread(null);             setState(0);                 return false;         }          @Override         protected boolean isHeldExclusively() {             return getState() == 1;         }          public Condition newCondition() {             return new ConditionObject();         }      }      private Sync sync = new Sync();      @Override     public void lock() {         sync.acquire(1);     }      @Override     public void lockInterruptibly() throws InterruptedException {         sync.acquireInterruptibly(1);     }      @Override     public boolean tryLock() {         return sync.tryAcquire(1);     }      @Override     public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {         return sync.tryAcquireNanos(1, unit.toNanos(time));     }      @Override     public void unlock() {         sync.release(1);     }      @Override     public Condition newCondition() {         return sync.newCondition();     } } AQS实现
  底层数据结构:同步队列
  AQS中使用一个双向链表来保存等待同步状态的线程,链表的节点用其内部自定义的Node表示,Node类源码: static final class Node {     static final Node SHARED = new Node();     static final Node EXCLUSIVE = null;          volatile int waitStatus;     volatile Node prev;     volatile Node next;          volatile Thread thread;     Node nextWaiter; }
  waitStatus有五个状态: cancelled = 1:同步队列中的线程等待超时或者中断时的状态,后续不会再改变。 signal = -1:节点获取同步状态,一般是队头节点,后续节点处于等待状态。 condition = -2:节点在等待队列中(注意不是同步队列),线程等待Condition,当Condition调用了signal()之后,该节点会从 等待队列 转移到 同步队列 。 propagate = -3: initial = 0:初始状态。
  同步队列采用尾插法的方式,同时会使用CAS保证尾插的时候是线程安全的。其结构如下:
  其中队头是获取同步状态成功的节点,当首节点的线程释放同步状态的时候,会唤醒后继的节点,后继节点会成为首节点。(这个过程不用CAS,没有竞争的情况。)
  acquire方法流程 public final void acquire(int arg) {     if (!tryAcquire(arg) &&         acquireQueued(addWaiter(Node.EXCLUSIVE), arg))         selfInterrupt(); }
  同步队列中的节点不断地在自旋判断其 前驱节点是不是头节点 ,如果是则尝试获取同步状态,否则会阻塞节点中的线程。
  acquireShared方法流程 public final void acquireShared(int arg) {     if (tryAcquireShared(arg) < 0)         doAcquireShared(arg); }
  ReetantLock
  ReentrantLock,支持重入锁和公平与非公平锁。 ReentrantLock实现可重入
  重入锁:支持线程反复地获取锁资源而不会自己阻塞自己,有两个问题要实现: 线程再次获取锁,判断是否是当前线程获取锁。 锁的最终释放,需要计数锁被重入几次,计数器最终释放为0时才表示锁的最终释放。
  例如非公平锁每次再尝试获取锁的时候都会判断是不是同个线程,如果是的话增加计数器的值。释放锁时等到计数器的值为0时才将占有锁的线程设置为null。
  公平锁与非公平锁
  公平锁:获取锁的线程按照绝对的时间顺序,FIFO。
  非公平锁:只要CAS设置同步状态成功,就获取锁,不会按照FIFO顺序。
  ReentrantLock的构造方法中传入true时可以创建公平锁: public ReentrantLock(boolean fair) {     sync = fair ? new FairSync() : new NonfairSync(); }
  公平锁在tryAcquire的时候会判断当前线程是否有前驱节点,有的话则会等待前驱节点释放之后在获取尝试获取锁。 公平锁的tryAcquire:
  hasQueuePredecessors方法用来判断是否有前驱节点
  非公平锁的tryAcquire:
  问:如何实现公平锁? 构造函数的参数传入true,在重写的tryAcquire方法中判断当前线程是否有前驱线程,有的话尝试获取同步状态失败,以此来达到公平的效果。
  对比: 公平锁虽然会按照FIFO原则,但是会进行大量的线程切换,非公平锁虽然可能会造成其他线程饥饿,但是可以极大提高吞吐量。

虾青素在化妆品中的应用摘要简单概述了虾青素的来源组成和特性,并介绍了虾青素在化妆品中的应用。虾青素是一种对人体具有一系列特殊保护功能且性能优良的类胡萝卜素,它用于化妆品,可起到护肤免受紫外线(UVA,U这样用护肤品,不仅浪费钱,可能还会烂脸!看完别再踩雷大家有没有遇到过这种情况保湿美白紧致抗皱刷酸各类高功效的护肤品都上脸了,却好像没啥用。更难受的是,你花高价买来的护肤品,不仅不见效,还莫名其妙地泛红刺激烂脸?别着急给你的护肤品差评放下情绪,认真地探讨些事儿最近大家都经历了什么,我想已经不必多说什么了。愤怒恐慌迷茫无助失望各种负面消息负面情绪,两派之间的撕扯明明前两年我们是优等生,可是今年的变化让我们的信心深受打击。现在的状况,谁都不如果别人不尊重你,千万不要给他第二次机会认知不同,何须强融?其实你没必要和一些没必要的人,去说一些没必要的话,然后产生一些没必要的情绪。因为我们每个人立场不同,所求不一,所以不必要刻意地去强求认同和理解。不在别人的心中修白衣铁血春节喜庆声不断,成为你们军令状。穿着厚重防护服,看不清你们的模样,不知你们姓甚名谁,来自何方。却知你们坚守同一方向。世间生命本无轮回,唯有你们抗击一线。临危受命的你们,没有迟疑,犹在太原静默第八天,天气晴朗,喜忧参半今天是我在太原居家静默的第八天,早上起来拉开窗帘,明媚的阳光让屋子里比过去七天都要亮堂。终于出太阳了!太原迎来久违的大晴天。照例,今天做核酸的大白没有出现,寂静的窗外是我每天能看到世界杯最新积分排行榜世界杯最新积分榜(截止至2022年11月27日1200)A组荷兰4分厄瓜多尔4分塞内加尔3分卡塔尔0分A组B组英格兰4分威尔士1分美国2分伊朗3分B组C组沙特3分波兰4分墨西哥1分世界杯熬夜看球指南来了,赶紧点赞收藏2022年卡塔尔世界杯已经开始,对于铁杆粉丝来说,又是四年一次的熬夜之旅。啤酒和烤肉串饮料和干果作为熬夜观看比赛的必备零食。黑眼圈睡眠障碍和胃肠道不适等世界杯综合征疾病也被发现。今02!世界杯再爆大冷门,欧洲红魔轰然倒下,出线形势急转直下今天晚上,世界杯小组赛再战一场,结果爆出了大冷门,上届季军比利时02输给摩洛哥,遭到了首败。本场比赛,比利时控球占优,但是制造的绝对机会并不多,摩洛哥上半场打进一球被吹越位,下半场抖音花10亿买世界杯转播权,能回本吗?我认为抖音花10亿购买世界杯转播权,收不回成本,而且还会亏钱。第一用户不匹配足球属于高端体育运动,中国热爱足球的人士往往处于比较社会中上层,他们舍得花时间看世界杯比赛的话,就会躺在彭熙中参加2022中国徐州第二十五届国企国资专题推介会11月9日上午,中冶建工集团彭熙中一行至徐州市政府参加2022中国徐州第二十五届国企国资专题推介会,徐州市政府副秘书长翁乐天主持。徐州市政府出席人员林斌徐州市政府副市长丁广州徐州市
对宝宝的爱,永远不够!历史上的2021年2月26日,是正月十五元宵节,也是春节的最后一天,在依然禁止燃放烟花爆竹的北京家中,是我和大宝陪老伴儿剖腹产坐月子的第二十一天。二宝出疹子,腋窝脖子身上都有一些了亮剑电视剧中关于酒的硬伤本文为文文方丈聊老酒原创,想了解更多关于中国陈年白酒的文化和故事,欢迎关注文文方丈聊老酒,闲聊天南地北中国酒。近日,在头条上刷到神剧亮剑的剧情解说,不觉间竟一连看了好几个小时。意外朱琳101女孩的自信逆袭来源人民日报中央厨房哨声体育工作室新赛季希望可以闯入世界前五十,获得一个巡回赛单打冠军!这是朱琳在2023年1月为自己定下的目标。随着她在澳网闯入女单16强,并在泰国华欣站捧起女单63岁郎平大变样,穿国风裙子像少女,退休生活太惬意在提到中国女排的时候,郎平永远是避不开的话题,而现在围绕她的无外乎两个极端评价,一是带出历史最差成绩,二是期待她还能够再拾起教鞭,尤其是爆出她可能执教费内巴切女排的时候,很多人更是闵行新添2条标准旱地冰壶赛道,可预约免费使用圆明园重现古代冰嬉运动市民在冰场上玩起了花滑冰上龙舟冰上自行车官兵开启了一场趣味冰上运动会,足球拔河接力这个冬天,大家对参与冰雪运动的热情高涨,朋友圈随意刷一刷都是大家庆祝冬天可以郭晶晶,你凭什么让人敬佩?郭晶晶,一个在普通家庭长大的女孩,最后不仅仅成为了世界冠军,还成为了顶流豪门中让人敬佩的豪门媳妇。郭晶晶,很多人都想不明白,她为何人一步又一步走上人生巅峰。郭晶晶,很多人也想不明白欧美大厂过冬发行业务探路降本增效,过去一年频频出现在国内游戏厂商的形容上,事实上,2022年全球游戏市场大环境的低迷,导致国内外企业大同小异,削减开支砍项目关停出售等节流操作比比皆是。不同的是,去年年末多解决猫咪战车卡加载界面加载失败的情况CATSCrashArenaTurboStars猫咪战车比赛系统,锦标赛在锦标赛中,玩家可以通过连续打败一定量的对手或者在比赛结束前保持前6名的排名进入下一段位,同时玩家可以可以获腹胀腹满撑得慌?送你三个食疗方春节是万家团聚的日子,每逢佳节胖三斤,美食当前,一不小心就吃多了,很多人可能会出现饱胀腹满等不适,广东省妇幼保健院中医科副主任医师刘嘉芬支招,不妨试试以下几个食疗方法。消滞食疗方材面对辣椒的利与弊,我们应该如何食用,趋利避害呢?生活中,辣椒深受人们的喜爱,对于很多无辣不欢的朋友来说,辣椒已经成为了生活中不可缺少的一部分。辣椒如果适量食用,对大多数人来说有利无害。但是,如果不加以控制,可能会适得其反,对身体如何安全有效的补充维生素D?维生素D非常重要,是因为它对我们人体的免疫系统,有调控的作用。维生素D的重要性维生素D在天然的食物中含量非常少,无法满足人体的需要。维生素D主要通过人体皮肤照射太阳后,由皮肤中的胆