![](https://img-blog.csdnimg.cn/ff8762769c7b4df9b89850720e04de01.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
图解java.util.concurrent
文章平均质量分 97
以图解的方式,深入详细地介绍JDK的java.util.concurrent并发包里面的各种并发工具类的原理和源码。
黄俊懿
放下期待、不抱希望地努力,踏踏实实,能走多远是多远。
展开
-
图解java.util.concurrent并发包源码系列——深入理解定时任务线程池ScheduledThreadPoolExecutor
到这里,整个ScheduledThreadPoolExecutor的原理和源码都分析完毕了。用了一个延时队列DelayedWorkQueue去存放任务,延时队列又使用一个小顶堆去存放任务,小顶堆中的任务ScheduledFutureTask会按照到期时间time从小到大进行排序。当我们提交定时任务到ScheduledThreadPoolExecutor时,任务会被放入小顶堆中,然后会从底往上做堆调整。任务放入堆中之后,检查是否有必要创建新线程,如果有必要则创建新线程。原创 2023-12-02 09:08:49 · 509 阅读 · 0 评论 -
图解java.util.concurrent并发包源码系列——深入理解ConcurrentHashMap并发容器,看完薪水涨一千
ConcurrentHashMap是java.util.concurrent提供的一个并发安全的容器,可以实现高并发场景下读写的并发安全的同时兼顾了性能。它是HashMap的加强版,是并发安全的HashMap。ConcurrentHashMap是基于HashMap的扩展,所以可以先简单回顾一下HashMap。HashMap是一个存储键值对(key-value)的容器,往容器中放入元素要指定对应的key,往容器中获取元素前,通过指定key来获取对应的value。原创 2023-10-29 09:09:04 · 319 阅读 · 0 评论 -
图解java.util.concurrent并发包源码系列——各种各样的阻塞队列BlockingQueue一套带走(ノ`Д)ノ!!!
BlockingQueue是java.util.concurrent并发包提供的一个可以在高并发场景下使用的阻塞队列的接口,它的实现类包括ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue等等。BlockingQueue在各种使用Java编写的分布式或微服务中间件中使用得比较多。原创 2023-09-24 16:50:20 · 172 阅读 · 0 评论 -
图解java.util.concurrent并发包源码系列——深入理解Semaphore、CountDownLatch、CyclicBarrier并发编程三剑客
acquire方法调用sync.acquireSharedInterruptibly(1),acquireSharedInterruptibly是AQS定义的一个模板方法,会调用到继承AQS的子类的tryAcquireShared方法,然后就会进入到NonfairSync的tryAcquireShared方法或者是FairSync的tryAcquireShared方法。那是因为它不是可以被无效的获取的,我们需要给定一个初始值作为最大的可被获取数,当锁被获取完以后,后面过来的线程就只能阻塞等待了。原创 2023-08-12 21:03:24 · 214 阅读 · 0 评论 -
图解java.util.concurrent并发包源码系列——Condition条件等待队列深入详解
可以看到Condition接口除了普通的等待和唤醒方法,还提供了不响应中断(默认响应中断)和带超时机制的等待方法。可以看到ConditionObject内部带了头指针firstWaiter和尾指针lastWaiter。通过ReentrantLock的newCondition方法可以获取到ConditionObject对象。原创 2023-08-12 14:42:08 · 375 阅读 · 0 评论 -
图解java.util.concurrent并发包源码系列——深入理解ReentrantReadWriteLock读写锁,看完可以吊打面试官
上一篇文章,介绍了ReentrantLock的作用和源码,了解到ReentrantLock是如何通过AQS去实现它的可重入锁的功能的。这次我们再了解另一个并发工具类ReentrantReadWriteLock读写锁,我们从ReentrantReadWriteLock的作用到源码,了解如何通过AQS实现更复杂的并发工具类。因为ReentrantReadWriteLock使用到AQS实现自身的功能,所以需要对AQS有一定的了解,本篇文章同样不会对AQS做过多的介绍。原创 2023-08-11 08:02:26 · 120 阅读 · 0 评论 -
图解java.util.concurrent并发包源码系列——深入理解ReentrantLock,看完可以吊打面试官
上一篇文章(图解java.util.concurrent并发包源码系列——深入理解AQS,看完可以吊打面试官 )介绍了AQS的原理和源码,然后使用AQS实现了一个排他锁,这次我们看看Java的并发包里面基于AQS实现的锁工具类——ReentrantLock。本文会介绍ReentrantLock的功能,以及ReentrantLock如何通过AQS实现它的功能,但是不会再介绍AQS的相关原理,关于AQS的原理和源码,可以看上一篇文章。原创 2023-08-05 16:34:31 · 274 阅读 · 0 评论 -
图解java.util.concurrent并发包源码系列——深入理解AQS,看完可以吊打面试官
AQS提供自定义资源的功能,AQS里面有一个int类型的state变量,我们自己的实现类继承AQS后,就拥有了这个state变量,我们可以自己定义这个state变量不同的变量值对应的语义。比如我实现了一个排他锁,那么我就定义当state等于1时,代表此时排他锁是处于没被获取的状态,线程可以过来获取排他锁,而当state小于等于0时,代表已经有线程获取了排他锁,其他线程必须阻塞等待。另外,AQS提供了state变量的set、get方法,以及CAS修改state的方法。原创 2023-08-05 08:22:58 · 195 阅读 · 0 评论 -
图解java.util.concurrent并发包源码系列——LongAdder
上一次讲到如果我们高并发写的情况下使用原子类,比如AtomicLong,会存在大量的CAS更新失败,导致CPU一直空转。要解决这种情况,我们可以使用,本篇文章将会对等内容进行阐述。原创 2023-07-22 17:16:34 · 112 阅读 · 0 评论 -
图解java.util.concurrent并发包源码系列,原子类、CAS、AtomicLong、AtomicStampedReference一套带走
Unsafe类,可以通过这个类做一些更底层的操作,我们以内存分配和释放为例。但是我们可以通过Unsafe类,来分配和释放内存,Unsafe类提供了allocateMemory方法可以用于内存的分配,freeMemory方法进行内存的释放,它们都是native方法,会调用到底层的C++代码。在给一个变量赋值之前,会先判断这个变量的值是否和我们预期的一致,如果一致,则表示中间没有人修改过,那么就可以把变量设置为我们传递的值,如果变量的值和我们预期的不一致,表示中间有人修改过,那么就不设置为我们传递的值。原创 2023-07-18 20:52:33 · 281 阅读 · 0 评论 -
人人都能看懂的图解java.util.concurrent并发包源码系列 ThreadPoolExecutor线程池
本文深入讲解java.util.concurrent并发包的ThreadPoolExecutor线程池:主要介绍了ThreadPoolExecutor的作用;ThreadPoolExecutor的核心原理,包括ThreadPoolExecutor的核心组件以及他们之间的关系;介绍了ThreadPoolExecutor的execute方法里面的执行流程;最后介绍了ThreadPoolExecutor的核心源码,主要包括execute方法、addWorker方法、runWorker方法的介绍。原创 2023-07-15 07:43:57 · 220 阅读 · 0 评论