jdk多线程
文章平均质量分 80
烛影摇红透纱窗
这个作者很懒,什么都没留下…
展开
-
ThreadLocal 实现
一. ThreadLocal 如何实现和每个 Thread 绑定, 从而避免线程安全问题 ThreadLocal 的类结构 ThreadLocal 有静态内部类 ThreadLocalMap, ThreadLocalMap 有静态内部类 Entry. Entry 是键值对, 存储<ThreadLocal, Object>. 就是说每个 ThreadLocal 对象对应一个 object 的value. 每个 thread 对象都有唯一的 threadLocalMap 属性, 而 thre原创 2021-07-10 14:23:21 · 212 阅读 · 0 评论 -
ConcurrentHashMap特性
先说说 HashMap 原理吧? HashMap主要由数组和链表组成,他不是线程安全的。核心的点就是put插入数据的过程,get查询数据以及扩容的方式。JDK1.7和1.8的主要区别在于头插和尾插方式的修改,头插容易导致HashMap链表死循环,并且1.8之后加入红黑树对性能有提升。 1. put 插入数据流程 往map插入元素的时候首先通过对key hash然后与数组长度-1进行与运算((n-1)&hash),都是2的次幂所以等同于取模,但是位运算的效率更高。找到数组中的位置之后, (1) 如果数原创 2021-06-21 11:38:25 · 242 阅读 · 0 评论 -
concurrent 笔记 - volatile 与 Synchronized 关键字
一. volatile volatile的语义 Java内存模型对volatile关键字定义了一些特殊规则. 首先从volatile的语义开始说起, 再得出Java内存模型对volatile设定的几个规则 1. 禁止volatile代码附近指令重排 (1) 何为指令重拍? 普通变量只能保证在依赖其他变量的结果进行计算时可以获得正确结果, 但不能保证变量的赋值顺序和代码中的顺序一致. 这也是满足了Java内存模型中线程内部表现为串行的语义. 指令重拍是机器级的优化, CPU往往会把赋值操作的语句和不依赖该原创 2021-06-21 00:44:14 · 180 阅读 · 0 评论 -
concurrent 笔记 - 有界阻塞队列实现
阻塞队列的实现 1. 有界队列 队列中的元素个数有限, 队列为空时, get 操作或阻塞, 队列满时, add 操作会阻塞。 常见的有界队列时 ArrayBlockingQueue 和 LinkedBlockingQueue. 有界队列的写法, 一般是有一把全局大锁同步读写操作,notFull 和 notEmpty 两个 Condition 作为条件谓词进行空满检验。 ArrayBlockingQueue 和 LinkedBlockingQueue也是这样实现的, 不同的是前者只有一把大锁, 读写没有分离;原创 2021-06-20 19:02:22 · 226 阅读 · 0 评论 -
JCU-线程栅栏CountDowLatch与CyclicBarrier,Exchanger
CountDowLatch 用法 (1) CountDowLatch 用来同步一个或多个线程, 强制这些线程等待由其它线程执行的一组操作完成 (2) 可以向 CountDowLatch 设置一个初始计数, 任何在这个对象上调用wait()方法的线程都会阻塞挂起, 等待内部计数值为0 ; 其它线程在完成工作时, 可以调用 CountDowLatch 的countDown()方法来减小计数值 (3) CountDowLatch的计数值不能被重置, 因此, 一旦一个CountDowLatch对象的计数值到达0原创 2021-06-20 16:24:47 · 149 阅读 · 0 评论 -
JCU-futuretask如何实现
一. Future是什么? 1. Future是什么? JDK 的 Future 就类似于我们网购买东西的订单号,当我们执行某一耗时的任务时,我们可以另起一个线程异步去执行这个耗时的任务,同时我们可以干点其他事情。当事情干完后我们再根据 future 这个"订单号"去提取耗时任务的执行结果即可。因此 Future 也是多线程中的一种应用模式。 扩展: 说起多线程,那么 Future 又与 Thread 有什么区别呢?最重要的区别就是 Thread 是没有返回结果的,而 Future 模式是有返回结果的。原创 2021-06-20 15:54:21 · 264 阅读 · 0 评论 -
AQS 同步器
条件等待队列 每个对象都可以作为一个"条件等待队列", 正如每个对象都可以作为"锁"一样. 对象的 “条件等待队列” API有2个 ``wait()` - wait() 要写在 while 循环内 while( 条件检查 ) { obj.wait() } 因为线程可能被错误唤醒, 所以wait醒来后要再次检查等待条件 notify() jvm 从对象的条件等待队列中选择1个线程进行唤醒. 这个操作是危险的, 因为可能造成``信号丢失问题. 线程B使用obj.notify()唤醒了线程A, 而线程原创 2021-06-09 20:07:20 · 97 阅读 · 0 评论 -
ThreadPool 框架分析
一. 构造参数和属性含义 corePoolSize: 池子中保持的线程数量, 即使空闲, 也不会销毁 maximumPoolSize: 池子中最大的线程数 keepAliveTime: 当池子中线程数量大于 corePoolSize 时, 哪些空闲的线程多久会 timeout 被销毁 workQueue: 待执行的任务池 RejectedExecutionHandler 拒绝策略: 默认 AbortPolicy, 直接抛出异常 // 全局的 worker 列表 private final HashSet&l原创 2021-06-08 16:07:49 · 96 阅读 · 0 评论