首页 > 其他分享 >JUC复习随手笔记

JUC复习随手笔记

时间:2023-02-24 21:58:00浏览次数:33  
标签:slot JUC 复习 阻塞 笔记 ThreadLocal 线程 执行 节点

1. await——》wait,signal——》notify,signalAll——》notifyAll

  • await会先释放锁,然后执行park
    • park本身不释放锁

2. ConcurrentHashMap 1.7 1.8

1.7

  • 底层实现是分段锁,segment一旦初始化不可扩容,默认16
    • map的扩容针对的是段内的entry数组

1.8

  • 底层结构和HashMap一样,分任务段给多个线程进行数据迁移

3. ConcurrentLinkedQueue HOPS延迟更新

  • 当tail指向的节点的下一个节点不为null的时候,会执行定位队列真正的队尾节点的操作,找到队尾节点后完成插入之后才会通过casTail进行tail更新;当tail指向的节点的下一个节点为null的时候,只插入节点不更新tail。
  • 当head指向的节点的item域为null的时候,会执行定位队列真正的队头节点的操作,找到队头节点后完成删除之后才会通过updateHead进行head更新;当head指向的节点的item域不为null的时候,只删除节点不更新head。

目的:减少大量并发写入删除操作时频繁更新头尾结点的操作

4. interruped会清除打断标记

5. 线程池

参数

  • 核心线程数

  • 任务/阻塞队列

  • 拒绝策略

    • 直接抛出异常,默认
    • 由调用者线程执行
    • 丢弃最前面的任务,加入当前任务
    • 丢弃任务,不抛异常
  • 最大线程数

  • 线程空闲保持时间

    • 非核心线程达到时间就会退出
  • 时间单位TimeUnit

  • 线程创建工厂

为什么不允许Executors创建

  • 无限堆积任务,OOM

    • newFixedThreadPool
      • 所有线程都是核心线程,创建时设置大小
    • newSingleThreadExecutor
      • 核心线程和单个线程都是1,核心线程出异常就创建一个新的代替
  • 无限创建线程,OOM

    • newCachedThreadPool

      • 所有线程都是非核心线程,均可回收
    • newScheduledThreadPool

      • 初始化指定核心线程数,可用于定时任务

6. CountDownLatch

  • 底层依靠Sync内部类(继承AQS)
  • await(),countDown()

7. CyclicBarrier

  • 内部类Generation,每一次使用CB都可以看作是Generation的一个实例,Generation内部Broken属性记录当前代是否被破坏
  • CDL像是计数器,一个线程执行完成计数减一,阻塞主线程直到计数为0
    • CB像同步器,加入一个线程(调用await())就阻塞,计数加一,阻塞的线程数达到设置的阈值,调用(runnable任务(如果设置了)),不会阻塞主线程的执行
  • 执行await()会判断当前阻塞的线程数是否达到设定值,达到了还会执行nextGeneration()生成下一代,signalAll唤醒上一代阻塞的所有线程

8. Semaphore

  • 信号量没有重入概念,只有10个令牌,一个线程执行11次qcquire()也会被park住
  • release()能添加令牌,和初始化设置几个令牌无关,初始化10个,可以调用11次release()

9. @Contended

填充缓存行,一条CacheLine内只有需要存储的数据,解决缓存为共享问题

  • CacheLine存储了a、b,一个线程修改了a,总线嗅探到之后其他线程CacheLine里有a的都需要失效,这时候b也就跟着失效了

10. Exchanger

  • 解决两个线程通信的问题
    • a线程向空slot插入数据,阻塞等待b线程传递数据,b线程取出指定slot的数据,再插入需要给a的数据
    • 内部类Participant继承ThreadLocal,为每一个线程保留唯一的Node结点,所以每个线程都能找到自己的slot
    • 在没有竞争的情况下使用单个Node结点的slot,当出现多个线程都需要交换数据(a和b,c和d)这时候就需要Node数组arena数组槽
  • 不同JDK版本的实现
    • 5中只有单个slot
    • 6开始类似ConcurrentHashMap分段锁的思想
  • SynchronousQueue是单向的,Exchanger传递两个数据,a-》b,b-》a
  • 先到先得,a,b,c,d同时执行exchange(),根据实际执行的先后顺序存取存取

11. ThreadLocal

每个Thread都有一个内部类ThreadLocalMap,调用ThreadLocal.set()时实际是把这个ThreadLocal对象存入Thread内部的ThreadLocalMap中,key就是ThreadLocal(this)

  • ThreadLocalMap不是Map的实现类,是内部的自实现,维护一个Entry数组
  • Entry数组是弱引用的
  • 当不在强应用ThreadLocal时,key会被回收,value因为是强引用所以会被保留,Java8优化,调用get()、set()、remove()时会清除掉ThreadLocalMap所有key为null的value,下一次GC会回收内存

标签:slot,JUC,复习,阻塞,笔记,ThreadLocal,线程,执行,节点
From: https://www.cnblogs.com/Cra2iTeT/p/17153304.html

相关文章

  • 【高数复习笔记】计算不定积分的一些方法
    【高数复习笔记】计算不定积分的一些方法快期末了,题做厌了就随手写点东西-_-然后摆烂~~凑微分​ 凑微分要求对一些常见函数的原函数十分熟悉,而且还要熟悉微分的运算法......
  • ZSTD相关笔记.md
    目录相关资料测试不同字典大小样本的压缩率情况样本大小:102MB(107,155,190字节)样本数量:173842不使用字典进行压缩时的压缩率按照ZSTD最小的字典大小256训练试试样本......
  • 2023算法笔记
    Hoppz算法笔记前言2023_02_18还是太菜了,笔记基于《算法导论》&&《数据结构与算法分析C++描述》,想着为复试准备(虽然很大程度上今年是考不上了),就开始重看算法导论,前......
  • 极光笔记 | 埋点体系建设与实施方法论
    PART 01 前言随着网络技术的发展,从粗犷型到精细化运营型,再到现在的数字化运营,数据变得越来越细分和重要,不仅可以进行策略调整,还可以实现自动化的精细化运营。而数据价值......
  • 极光笔记 | 埋点体系建设与实施方法论
    PART01前言随着网络技术的发展,从粗犷型到精细化运营型,再到现在的数字化运营,数据变得越来越细分和重要,不仅可以进行策略调整,还可以实现自动化的精细化运营。而数据价值......
  • 图笔记
    图笔记图的遍历代码结构和回溯代码结构相似,因此在整理回溯题目之后整理了图相关的题目,这部分的题目考察较少,不建议花太多工夫,了解常用的算法即可,力扣周赛后两题极高概率......
  • React Native学习笔记----React Native简介与环境安装
    ReactNative的基础是React,是在web端非常流行的开源UI框架。要想掌握ReactNative,先了解React框架本身是非常有帮助的。一、什么是ReactNative1.1ReactNati......
  • 阿里云ACP学习笔记-负载均衡SLB-弹性伸缩AS-对象存储OSS
    9负载均衡SLBECS+SLB+AS CDN              协议支持:  SSL证书管理:       10弹性伸缩AS 11对象存储OSS ......
  • <<运维监控系统实战笔记>> 小记随笔 —— Prometheus 初识
    Prometheus简介Prometheusserver包含时序库、告警引擎、数据展示三大块,体系中最核心的组件Exporters采集数据的客户端,负载采集数据存在内存中,提供http接口,让......
  • 常系数齐次线性递推学习笔记
    求一个满足\(k\)阶齐次线性递推数列\(a_i\)的第\(n\)项,即:\[f_n=\sum_{i=1}^ka_if_{n-i}\]\(n\leq10^{18},k\leq32000\)。使用矩阵乘法加速可以做到\(O(k^3\l......