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

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

为什么电竞屏要选高刷?知识分享ampampamp雕塑家MF16LE便携显示器评测随着家用电脑的普及与硬件配置的提升,如今的电脑硬件慢慢有了很多新名词,比如家用级电脑企业级路由器入门级键鼠专业级显卡等等。显示器作为电脑的主要输出设备,同样内卷的也非常厉害。如果我ELAC意力Miracord80黑胶唱盘德国ELAC(意力)在黑胶领域上的成就,或许由于品牌旗下音箱的名气太盛了。其实ELAC在黑胶领域拥有传奇和辉煌的历史。ELAC自1926年诞生,一直致力于声呐科技的军事化研究,开发信创风来,六大国产CPU厂商各显神通CPU是计算机硬件核心,ARM大有可为CPU是计算机的底层基础硬件,整个软件生态架构都建立在底层CPU架构之上。CPU指令集主要有X86ARMRISCV等,2021年X86架构生态鸿蒙OS换到英文,为何运行服务HarmonOS变成AndroidSystem?不用洗,这就是华为的问题,前些天,咨询了华为的人,终于得到回复,确定是内部疏忽了,就是显示的问题,软件编程规范,在不同语言设置下,应该调用同一变量,结果英文下单独定义了。华为从来没哪些APP更适合老人用?中消协评测了104款APP发现12月8日中国消费者协会发布适老化APP消费监督评测项目研究报告报告显示评测的104款常用APP中76的APP适老化改造达标率超75其中通过工业和信息化部适老化改造评测的34个AP一家五口全确诊,7个月宝宝遭大罪!真没想到作者43楼编辑部肖子来源妈妈网育儿(IDmmwyuer)昨天是新的里程碑,走出疫情阴霾的号角已经吹响。新十条打破了跨地区人员流动的限制,不再对跨地区流动人员查验核酸检测阴性证明和健记住这五点,孩子不会再顶嘴记住这五点,孩子会不再顶嘴,家长们快收藏起来。第一,大人要忍住脾气,坐下来,让孩子说出内心的想法。每个人都有自己的想法,孩子也不例外。孩子顶嘴,咱们做家长的不要上来就发火,语气语调这些热门的球类运动真的有益于孩子的骨健康吗?人体骨骼共有206块,分颅骨四肢骨躯干骨三大部分,它们的功能是支撑人体,还可形成空腔来保护脑心肺等内脏,是人体的重要器官。骨骼的生长决定身高,尤其是青少年阶段,促进骨骼健康成长是非想办法让孩子开心地玩小时候经常听老师说,不会玩的孩子也不会学。机智儿子一年级时有一位非常优秀的数学老师也反复强调学的时候好好学,玩的时候开心玩。我一直以为理解了老师们说的话,直到今天看到书上的一段话,杭州互联网法院AI换脸乐趣多?也要当心侵权!法院判了AI换脸正在走红网络只需一张照片经过深度合成算法处理就能秒变视频主人公但换脸也伴随着法律风险和侵权纠纷近日,杭州互联网法院就审理了一起因AI换脸App利用深度合成算法侵害他人肖像权5枚圈铁混合单元不提一句堆料,仅用技术说话!AFULBAND5PRO试听明明有一个动圈和四枚动铁,并且还是混合着娄氏和声扬两大动铁单元品牌的耳机,但是在其购买页没有看到一处文字来展示其动铁单元,这操作是不是有些反常规?一般这种做法要么是特意隐藏单元信息
甩锅女明星掩盖自己无能,一个公主抱,暴露了男明星的真实嘴脸电视剧中,公主抱成为了男明星显示男友力的标配。剧中,他们总是男友力爆表,一言不合就抱走女主角。然而,事实却恰好与之相反。镜头后的他们,一米八的男友力弱的连女演员一条腿都扶不起来。还女排训练出成果!女排杨千嬅猛涨肌肉,李盈莹暴瘦是喜是忧?6月1日,中国女排就将亮相世界联赛土耳其安卡拉站,目前女排主帅蔡斌和姑娘们为打响第一炮,在漳州作着最后的准备,于三日后就将飞赴安卡拉站,开始为期一个月的漫长征战。经过漳州的封闭训练最佳阵容公布字母哥全票入选一阵,KD库里领衔二阵,老詹三阵今日,NBA官方公布20212022赛季最佳阵容,第一阵容名单德文布克场均26。8分5。0篮板4。8助攻,太阳64胜18负,队史最佳战绩,联盟第一。卢卡东契奇场均28。4分8。7助官宣!33岁女排奥运冠军最终处罚结果禁赛4年北京时间5月24日,官方消息,闹得沸沸扬扬的巴西女排接应坦达拉药检阳性事件有了最终的结果,坦达拉被判禁赛四年。这意味着,坦达拉的排球生涯基本已经结束了,因为她原本已经到了职业生涯的维金斯在勇士打出自信,罕见隔扣振奋人心,昔日状元要争FMVP?202122赛季NBA季后赛继续进行,勇士前往客场挑战独行侠。最终,勇士经受住了考验,成功赢下西决G3,系列赛大比分30领先独行侠。至此,勇士成功夺得西决赛点,再赢一场就能晋级总决奔着杨超越追说英雄谁是英雄,却被女二迷住了,长相美艳大气今年的鹅厂太出圈了,3月份的余生,请多指教在肖战杨紫的带领下,帮鹅厂狂赚了一大波热度。之后杨洋赵露思主演的且试天下也不甘示弱,播出期间连续35天斩获播放量日冠,累计播放量突破33亿蔡崇信正式制裁欧文!杜兰特罕见发火我的兄弟价值10亿美金欧文在本赛季没少站出来搞事情,赛季末的时候好不容易等到了纽约取消防疫规定,才刚刚可以正常打比赛,但是没想到他马上就又开启了斋月,这让他的状态直线下滑,毕竟运动员不吃饭的话对于体能是茶香弥漫中等待喜马拉雅的日出山脊上的古镇班迪布尔,是我尼泊尔之行的意外收获。站在民宿的平台上,眺望远山雪峰绿树鲜花蓝天白云,如梦如幻,鲜为人知的班迪布尔真是人间仙境。作为旅游景点,这里还未被开发。来的游客除了节能学院AcrelEIoT能源物联网云平台助力电力物联网数据服务摘要AcrelEIoT能源物联网云平台是一套结合了线上销售的互联网商业模式,为分布广泛的互联网用户提供PAAS服务的平台。用户完成安科瑞物联网产品安装之后,可通过手机扫码便捷地实现从实验室到生产力国网湖北电力晒出科技成果转化成绩单来源人民网湖北频道配电架空裸导线带电注涂绝缘层机器人。李威摄5月23日,从国网湖北电力获悉,该公司今年14月科技成果转化收益同比增长2倍,这得益于国网湖北电力推动科技创新的一揽子强长虹美菱2021年盈利5189。84万元拟10派0。5元中证财讯长虹美菱(000521)3月31日披露2021年年度报告,公司实现营业总收入180。33亿元,同比增长17。19归母净利润5189。84万元,同比扭亏扣非净利润亏损1。40