CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。
await() //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
countDown() //将count值减1
  CyclicBarriar:用于多个线程在一个指定的公共屏障点(或者说集合点)相互等待,await()方法代表屏障点,每次调用await(),计数(创建CyclicBarriar对象时传入int类型的参数,表示初始计数)减一,直到减到0后,表示所有线程都抵达,然后开始执行后面的任务,示例代码:
Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
CAS的思想很简单:三个参数,一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。
AtomicInteger的实现为例,分析一下CAS是如何实现的。
Unsafe,是CAS的核心类,由于Java方法无法直接访问底层系统,需要通过本地(native)方法来访问,Unsafe相当于一个后门,基于该类可以直接操作特定内存的数据。
变量valueOffset,表示该变量值在内存中的偏移地址,因为Unsafe就是根据内存偏移地址获取数据的。
变量value用volatile修饰,保证了多线程之间的内存可见性。
AbstractQueuedSynchronizer内部使用CLH锁队列来将并发执行变成串行执行。整个队列是一个双向链表。每个CLH锁队列的节点,会保存前一个节点和后一个节点的引用,当前节点对应的线程,以及一个状态。这个状态用来表明该线程是否应该block。当节点的前一个节点被释放的时候,当前节点就被唤醒,成为头部。新加入的节点会放在队列尾部。
总体原理是先去尝试获取锁,如果没有获取成功,就在CLH队列中增加一个当前线程的节点,表示等待抢占。然后进入CLH队列的抢占模式,进入的时候也会去执行一次获取锁的操作,如果还是获取不到,就调用LockSupport.park将当前线程挂起。那么当前线程什么时候会被唤醒呢?当持有锁的那个线程调用unlock的时候,会将CLH队列的头节点的下一个节点上的线程唤醒,调用的是LockSupport.unpark方法。

JCU并发包原理总结相关推荐

  1. seo模拟点击软件_关键词快排是什么?SEO快排、刷点击和快排发包原理分析

    如今大多数SEO快排都宣称自己是安全的SEO发包技术,但这种可能的发包技术原理更能解释为什么百度指数比百度表现更好. 如今,带来的是"用户行为影响排名.刷点击和快排分配原则".但愿 ...

  2. java 并发包 使用场景_java并发包原理及使用场景

    java并发包下有很多内置的处理线程安全问题工具类,在集合中就有2种线程同步的类,比如:Vector较ArrayList线程安全,但是效率较低,同样的还有Hashtable和HashMap,在实际项目 ...

  3. 关于JCU并发包中的Atomic原子类及其CAS

    希望造成叫醒你的是梦想 而不是闹钟 目录 类型 常用方法 CAS CAS与Atomic原子类 自旋锁 CAS缺点 Atomic原子类: 在化学中,原子是构成一般物质的最小单位,是不可分割的.而在这里, ...

  4. 掌握Volatile关键字及其牵扯的JUC并发包

    熬不过的日子就让自己忙碌起来 目录 Volatile三大特性 保证可见性 JMM内存模型 原理 不保证原子性 原因 Atomic原子类 禁止指令重排 内存屏障 应用场景 状态标识 一次性安全发布 独立 ...

  5. 封包协议,加密解密,线程发包,recv,明文收包

    一.封包,协议 什么是封包?封包就是按照某种协议组成的一段字节集.这个很容易理解 那为什么要按照某种协议呢?这个我们一会再说 所有联网的软件,包括网络游戏,客户端和服务端进行通信都是通过封包进行的. ...

  6. 游戏安全UE4引擎之天堂W跳线程,HOOK明文收包发包并分析加密解密,实现send发包

    开始我们的UE4的跳线程之旅 简单了解游戏数据 拿到一个游戏,想去分析,在什么都不了解的情况下,我们只能先盲目的找2个简单的数据熟悉一下,之后再根据需求系统的分析,这是必然的一个顺序. 那么,先来找下 ...

  7. flag!flag!flag!flag!flag!flag!flag!flag!flag!flag!flag!flag!

    1.Java基础,熟练使用集合类,JCU并发包,多线程管理:数据库基础(CRUD),事务特性和隔离级别:常见设计模式 2.Linux基本操作和相关指令,网络通信协议:Http,Socket 3.数据结 ...

  8. 中间件业务在网易轻舟容器平台的性能调优实践

    随着业务容器化的推进,经常有客户抱怨应用 QPS 无法和在物理机或者云主机上媲美,并且时常会出现 DNS 查询超时.短连接 TIME_OUT.网络丢包等问题,而在容器中进行调优与诊断的效果因为安装工具 ...

  9. 聊聊阿里面试的三个层次!

    最近去阿里的菜鸟国际做了一次面试交流,发现大公司对于面试者的知识结构考核非常严谨,可以作为我们日常工作学习的指导.虽然很多人说面试问到的东西在实际工作中很少用到,甚至有「面试造火箭,工作拧螺丝」的说法 ...

最新文章

  1. Django配置celery执行异步任务和定时任务
  2. web.xml中web-app标签报错
  3. 删除驱动符号链接出错-变量作用域和RtlInitUnicodeString的问题
  4. 启明云端分享|Linux系统下如何调试I2C设备
  5. 很好的Android论坛
  6. 计算机英语audios啥意思,2020考研英语词汇:audio是什么意思
  7. linux内核关闭网络巨帧xenomai,xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务...
  8. 曲率多项式转换为直角坐标系
  9. python快捷键设置_Pycharm学习教程(5) Python快捷键相关设置
  10. python反汇编指令_IDApython 命令
  11. WAP 的组成及主要特点
  12. 从小白到大数据人工智能专家的学习历程-送100G学习资料
  13. aix oracle调整逻辑卷的大小,AIX上增加逻辑卷时报错误0516-787 extendlv: Maximum allocation for logical volume(示例代码)...
  14. 阿里巴巴十周年有感----宗教的盛宴
  15. UVA - 1389 Hard Life【分数规划+最小割】【最大权闭合图】
  16. 超低功耗摄像头 门锁 猫眼
  17. services.msc 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动
  18. BitTorrent网络中基于Kademlia协议到DHT无服务器泛互联网搜索软件推荐
  19. 【报错解决】CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/nux-64
  20. linux下easyconnect启动不能连接外网

热门文章

  1. System.ObjectDisposedException: ‘Cannot access a disposed object.Object name: ‘Xamarin.Forms.Platfor
  2. 有趣的超短python代码_Python 学习之——Python超短教程
  3. 两种常见的美容仪器认证:英国UKCA认证欧盟ce认证
  4. 传感器的使用:光线传感器
  5. 真·卷积神经网络发明者福岛邦彦获奖!李飞飞、LSTM之父点赞祝贺
  6. html文本过长自动换行,css 长文本及长链接自动换行的几种方法
  7. MySQL数据库-子查询-表联接(内/外)-综合练习
  8. 高中课本计算机英语,高中英语第一册课本(上)U01speaking
  9. [Go语言入门] 14 Go语言goroutine和通道详解
  10. 一加6android9上手体验,一加6月牙白快速上手体验!除了双8配置还真爽!