多线程
文章平均质量分 67
一天是程序人
这个作者很懒,什么都没留下…
展开
-
使用ArrayBlockingQueue实现一个生产者消费者模型
提供一个demo,仅供参考public class ArrayBlockingQueueTestService { // 自定义线程池 static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2000, 5000, 100, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(1000原创 2022-05-22 09:47:35 · 429 阅读 · 0 评论 -
ScheduledThreadPoolExecutor实现延时及定时任务的步骤
ScheduledThreadPoolExecutor提供的两个方法来完成延迟及定时执行任务scheduleAtFixedRate及scheduleWithFixedDelay大致执行步骤:1)创建task任务2)将任务加入到延迟队列3)启用线程通过getTask方法从队列中获取任务4)延迟队列中的take方法获取任务时,会根据等待时间阻塞任务;针对scheduleAtFixedRate源码分析:public ScheduledFuture<?> schedul原创 2022-05-21 20:04:20 · 3315 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁的lock、unlock源码分析
先说一下结论,再分析源码,ReentrantReadWriteLock拆分了两把锁,一把读锁ReadLock,一把写锁WriteLock,读锁是共享的,写锁是独占的;也就是说,如果有线程在读,其他线程也可以读,但是不能写;如果有线程在写,则其他线程不能读也不能写。lockReadLock一、tryAcquireShared 获取共享锁先来看第一个方法tryAcquireShared获取共享锁主要分四部分,介绍这四部分之前先来介绍一点东西,AQS里边只有一个state来记录锁的原创 2022-05-06 23:17:53 · 640 阅读 · 2 评论 -
ReentrantLock的lock、unlock源码分析
一、lock可以看出加锁方法主要有这三步,最后那个selfInterrupt方法是中断线程,里边就一行代码中断线程,这里就不展开说了。先简单说一下这三步:1:通过CAS方式尝试获取锁2:获取锁失败的情况下,为当前线程创建node节点,加入到队列末尾3:加入队列后,判断前一节点是不是head节点,是的话尝试去获取锁;上一节点不是head节点,或获取锁失败,就将上一个节点的waitStatus改为-1,意思是告诉上一节点,你释放完锁后需要通知我,然后将自己线程park掉。1:tr..原创 2022-05-05 12:25:33 · 328 阅读 · 0 评论 -
AtomicInteger、AtomicLong、LongAdder的性能问题及源码分析
1、AtomicInteger这里主要看incrementAndGet方法可以看出,AtomicInteger的累加方法使用了unsafe中的getAndAddInt方法(这里的U是jdk.internal.misc.Unsafe类)AtomicInteger之所以使用unsafe进行数据累加而不适用volatile,就是因为volatile不能保证数据的原子性,而unsafe可以。我们看到,unsafe中的累加方法是通过CAS实现的,多线程并发时,同时只会有一个修改成功,其它的线程会原创 2022-05-04 13:27:21 · 1710 阅读 · 0 评论