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

一文带你深入理解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原则,但是会进行大量的线程切换,非公平锁虽然可能会造成其他线程饥饿,但是可以极大提高吞吐量。

一加10T在测试中被掰弯,公司回应称手机上市前已通过全面测试IT之家8月23日消息,一加本月初在海外发布了年度旗舰一加10T,该机对应的国行版机型为一加AcePro。上周,一加10T接受了知名YouTube频道JerryRigEveryth约2000元起三星A235G发布搭载骁龙695移动平台手机中国新闻三星的A系列,一直是Android阵营里出货量最高的手机系列之一。而近日,手机中国注意到,三星有一款A235G已经正式发布。目前,这款产品提供4GB64GB和6GB12从苹果换到国产手机,不是因为没钱,而是RedmiK50至尊版过于诱人iPhone12因为续航太垮塌,打游戏发烫太严重,于是纠结了许久还是把iPhone12出了二手,换成了前不久刚推出的RedmiK50至尊版。说实话,刚从iOS换到Android的那诛仙世界开荒体验,两天通关副本,这真的是20级副本的难度?诛仙世界为期5天的首测,目前已经过了4天,本次测试开放的副本之一黑石洞,玩家们也已经从开荒时各种团灭,到现在组野队都能速通。作为一名耗费了整整两天,接近12个小时才通关全程的玩家,体验服23日更新,赵云喜迎加强,狄仁杰二次削弱,远古生物调整大家好我是指尖,体验服23日更新,对四名英雄进行了平衡性的调整,其中赵云的加强简直令人狂喜,我想很多人也和我一个看法吧,一起来看看有哪些改动吧。远古生物河道之灵中路河道之灵和边路的植物大战僵尸花园战争2新手前期玩法心得今日小编给我们带来的是一位玩家共享的植物大战僵尸花园战争2新手前期玩法心得,不知道新手怎样玩的玩家,快跟小编一起来看看吧。作者我也是从一代玩起,触摸时刻不长或许就几个月时刻,因为很植物大战僵尸花园战争2玩法平衡性等方面体验评价植物大战僵尸花园战争2发布后,信任大家都有体会游戏,游戏好玩吗?今日为大家带来一位玩家的游戏点评,看一看植物大战僵尸花园战争2服务器玩法平衡性等方面是否让人满足。EA继花园1成功坑最佳周穿越云海,相约光遇有的游戏给我们快乐的操作感,有的游戏给我们很高的挑战,有的游戏让我们自由创造世界,给我们带来很强的成就感。有这种游戏,美丽的风景,动人的音乐。在这个世界上,成为尽情游泳感受浪漫和治王者猎人限时活动招募达标本文首发猎人攻略组公众号,未经授权禁止抄袭文章转载至其它平台。这是个增加战力的好活动,争取完成400次把奖励领完。高级召唤50次奖励5张招募契约20随机红将碎片10个绿水晶高级召唤4年前,遭国人抵制,被迫退出中国市场的韩国乐天,现在咋样了?选择决定命运,这不仅仅是于个人而言,于一个企业也是如此。近年来,随着我国经济的复苏与繁荣,无数外企瞄准了中国这个庞大的市场,纷纷想来分一杯羹。但是想做与做到是两码事,有太多的企业风小米上半年才赚7亿多,网易却赚了96亿,丁磊一直在闷声发大财很多公司都陆续发了上半年的财报,很多人公司利润都大跌,包括了阿里腾讯等龙头。另外小米的利润下滑都让人更是吃惊,上半年利润只剩下了7亿多。去年同期的时候,小米的半年利润还高达160亿
还记得坏笑弟弟表情包王锡玄吗?16岁带小女友上节目?毕竟这是一个英(全)雄(民)辈(狂)出(欢)的时代,有些人明明在飙戏,却成为行走的表情包。像是亚洲表情三巨头之一的金馆长崔成国注册微博分分钟认领自己的表情包,还要主动cue梗,金馆不嫁豪门嫁才子,与汪峰把生活过成了ampampquot诗ampampquot,女神章子怡的好命人生爱是遇见,不是等待而来,也不是准备而来妻子的浪漫旅行这档综艺上汪峰隔空对章子怡告白听完这两段话,章子怡早已感动到哭泣。很多人至今好奇,事业如此成功的章子怡,为何走下神坛,选择汪峰作从长津湖追溯惊沙,敌人换了,感动从未变过等了这么久,电影长津湖终于上映了,老菜新炒,依然可以轻松问鼎票房冠军。除了故事硬核之外,演员硬核也是不争的事实。说实话,那段历史无论谁来讲,无论怎么讲,只要能把事讲清楚,都能把听者被称为张彻最烂电影的西行平妖,真的一无是处吗?张彻张彻,香港影史第一位百万导演武侠大宗师阳刚美学的创始人。他一生导演电影近百部,其中经典之作不胜枚举。同时他也培养出许多优秀的弟子,成为香港电影的中坚力量。大上海19371985毒液2上映口碑差,泄露的彩蛋却让粉丝疯狂蜘蛛侠露正脸了头号电影院懂小姐(topcinema原创,严禁转载)就在这几天,海外的电影市场也变得热闹起来,007无暇赴死在海外的好口碑和票房成绩都非常亮眼,与此同时,还有一部备受动漫迷期待的漫我和我的父辈诗篇我看了,章子怡精明在哪?我和我的父辈上映了,四位年轻导演的作品,给人许多惊喜,与前面我和我的祖国我和我的家乡不一样,这一次并没有大导当总导演,四个单元的导演也都是半路出家,取得较好成绩的也只有吴京和徐峥。一代东方美神周洁离世,眉佳的表姐,曾主演电影杨贵妃10月3日上午,正当人们享受国庆长假的时候,导演胡雪桦在社交平台发文悼念著名舞蹈演员周洁,一代东方美人病逝他国,享年60岁。消息传来,许多娱乐圈旧友纷纷发文悼念,愿她一路走好!据有撒贝宁夫妇深夜约会!满面通红与妻子对酌,和路人打成一片没架子近日,有网友在社交平台上发帖,表示跟朋友外出喝酒的时候,偶遇了撒贝宁和李白,夸赞他本人超级nice,虽然不想打扰到撒老师,但自己还是厚着脸皮去要了签名,他走的时候还和大家调侃你们挺张译王俊凯主演重生之门杀青,剧照曝光新京报讯7月10日,影视剧重生之门宣布杀青并首次曝光剧照。官方微博配文称明暗交杂的光线,亦如明暗交错的人生投影。于黑暗中寻找光,追逐涅槃的力量。据悉,该剧将在优酷悬疑剧场全网独播,美媒评现代篮球十大巨星哈登落榜,库里不如杜兰特,科比不如詹皇近日,美国媒体排出了现代NBA的十大巨星,分别是勒布朗詹姆斯科比布莱恩特蒂姆邓肯凯文杜兰特斯蒂芬库里凯文加内特德克诺维茨基德文韦德扬尼斯安德托昆博科怀伦纳德。而奥尼尔转发了网友的一我和我的父辈电影观后感我和祖国在一起国庆看完我和我的父辈这部电影,在脑海里久久不能忘怀。这个电影分为四个篇章,分别写了从抗日战争时期到建设新中国再到改革开放时期最后是新时代面向未来。影片中的第一个片段是