并发编程
文章平均质量分 63
一枚老菜鸟~啦啦
这个作者很懒,什么都没留下…
展开
-
阻塞队列SynchronousQueue
offer(E e, long timeout, TimeUnit unit) 源码分析。生产者在调用上述方法时,第一个参数传递e,消费者在调用时,第一个参数传递null。如果在阻塞期间有消费者来匹配,生产者就会将绑定的消息交给消费者。在构建SynchronousQueue时会指定使用哪种子类实现。生产者等到阻塞结果,或者不允许阻塞,直接失败。生产者在阻塞期间线程被中断了,直接告辞。transfer核心方法源码分析。transfer方法流程图。消费者与生产者的原理一样。offer方法源码分析。原创 2023-05-23 23:10:34 · 122 阅读 · 0 评论 -
并发编程--延迟队列
也是基于二叉堆结构实现的,不同之处是DelayQueue是将剩余延迟时间最短的放在堆顶,继承Delayed接口,因此在使用DelayQueue时,需要实现Delayed方法,并重写两个方法。在应用上,比如外卖15分钟商家需要接单,否则,订单自动取消,可以每下一个订单就放在延迟队列中,如果规定时间内,商家没有接单,则通过消费者获取元素,然后取消订单。消费者要来拿数据,但是发现已经有消费者在等待栈顶数据了,这个后来的消费者也需要等待一会儿。消费者要拿到栈顶的数据,但是延迟时间还没到,此时需要等待一会儿。原创 2023-05-23 15:53:37 · 107 阅读 · 0 评论 -
阻塞队列&优先级队列源码解读
就是一个完整的二叉树,任意一个节点大于父节点或小于父节点(即小顶堆)PriorityBlockingQueue的写入源码分析。原创 2023-05-23 11:35:38 · 92 阅读 · 0 评论 -
并发编程--锁源码分析
偏向锁在升级为轻量级锁时,会涉及到偏向锁撤销,需要等到一个安全点(STW),才可以做偏向锁撤销,在明知道有并发情况,就可以选择不开启偏向锁,或者设置偏向锁延迟开启。如果一个操作是读多写少,采用上述操作,效率是很低的,这种情况可以采用ReentrantReadWriteLock去实现,原理是读读之间是非互斥的,即并发执行,如果是写操作,则还是互斥的。如果在一个循环中,频繁的获取和释放锁资源,这样带来的消耗很大,锁膨胀就是将锁的范围扩大,避免频繁的竞争和获取锁资源带来不必要的消耗。原创 2023-05-22 14:41:04 · 213 阅读 · 0 评论 -
并发编程的三大特性--有序性
单例模式由于指令重排可能出现线程会拿到没有初始化的对象,导致在使用时,由于内部属性为默认值,出现一些不必要的问题。java时乱序执行的,乱序执行的原因是尽可能的发挥CPU的性能。as-if-serial原则:针对于CPU级别的指令重排原则。happens-before原则:针对于jvm的指令重排。单例模式保证有序性的解决方案:volatile修饰变量。原创 2023-05-10 11:15:51 · 76 阅读 · 0 评论 -
并发编程的三大特性--可见性
错误代码示例如下:t1不会结束,因为synchronized在获取锁的时候从主内存获取flag,此时如果主线程还未修改flag标记,则获取到flag=true,synchronized获取锁读取到的是true,只有在内部代码执行完毕后释放锁了,才会去同步主内存,这就导致无法获取主线程修改后的flag值。现在的CPU都是多核的,每个线程的工作内存都是独立的,每个线程只会修改自己的工作内存,如果没有及时同步到主内存,就会导致数据不一致的问题。这个写回的数据,在其他CPU内核的缓存中直接无效。原创 2023-05-10 11:12:37 · 117 阅读 · 0 评论 -
Java线程基础知识扫盲
线程的等待(wait)和唤醒(notify/notifyAll),可以让获得synchornized的线程通过调用wait方法进入到锁的等待池中,并释放该线程的锁资源;可以让获取synchornized的线程调用notify或notifyAll方法,将等待池中的线程唤醒,进入到锁池中去竞争锁资源。在调用wait、notify、notifyAll时,必须要在有synchornized修饰的代码块中调用,否则会抛异常,因为是要操作某个对象的锁信息。线程的结束方式,return或抛异常均可实现线程的结束。原创 2023-05-08 23:35:07 · 60 阅读 · 0 评论 -
并发编程的三大特性--原子性
每一个线程都有自己的ThreadLocalMap,再基于ThreadLocal作为key,对value进行存取,ThreadLocalMap与ThreadLocal之间是弱引用,即若tl1引用不存在的情况下,ThreadLocal1对象会被GC回收。CAS(compare and swap)比较和交换,是CPU的一条原语,他在替换内存的某个值时,首先查看内存中的值是否与预期值一致,如果一致则执行替换操作。可以在CAS一次失败后,将这个操作暂存起来,后续获取结果时,将暂存的结果全部执行完,再返回最后的结果。原创 2023-05-09 22:04:45 · 78 阅读 · 0 评论