
多线程
icepigeon314
这个作者很懒,什么都没留下…
展开
-
Java线程池核心参数及实践
Java线程池的核心参数,估计很多人都能信手沾来,但如果再细问几个小问题,大部分人估计就答不上来了。1. 阻塞队列满了之后,如果线程数上限>核心线程数,新任务提交会导致创建新线程,新线程是优先执行刚到达的新任务还是阻塞队里的第一个任务?2.超过核心线程数创建的线程,再完成分配的任务之后是立即销毁还是优先检测并执行阻塞队列的未执行任务?3.为什么超过核心线程数之后,优先安排进入阻塞...原创 2020-03-30 20:34:47 · 295 阅读 · 0 评论 -
为什么ArrayBlockingQueue不使用LinkedBlockingQueue类似的双锁实现?
为什么ArrayBlockingQueue不使用LinkedBlockingQueue类似的双锁实现?在讨论这个问题之前,我们先来回顾下BlockingQueue的这两个实现类。我比较认同“程序等于数据结构加算法”的这一说法,对于面向对象设计的Java语言而言,类的字段对应数据结构,方法对应算法,所以从关键属性和方法就可以看出一个Java类的设计思路。先放上类图,只列出关键属性和方法。1....原创 2019-06-30 21:36:11 · 5149 阅读 · 8 评论 -
AbstractQueuedSynchronizer怎么用的?
AbstractQueuedSynchronizer是一个很复杂的抽象类,主要用于实现线程同步的各类解决方案,一共两千多行代码,本文不分析源码细节,试图从宏观层面分析AbstractQueuedSynchronizer的设计思路以及一些实际的使用场景。1、在线程的6种状态中,有三种使线程暂停的状态:BLOCKED/WAITING/TIME_WAITING,AQS将处于这三种状态的线程封装到No...原创 2019-07-07 23:27:17 · 304 阅读 · 0 评论 -
Thread的6种状态
Thread类中有一个State的枚举类型,定义了6种状态,源码如下:各个状态之间是可以相互转换的,状态图如下:为了加深Thread状态的理解,下面写了个测试程序,代码和结果如下:public class ThreadTest { public static void main(String[] args) { final Object obj...原创 2019-06-22 00:04:09 · 2131 阅读 · 1 评论 -
记一次Thread.join的思考(如何打断join阻塞状态?)
最近在温习Java Thread的各种状态变化,想到Thread.join方法的用法:当前线程阻塞到被join线程结束后才继续执行。于是我翻了以下Thread.join方法的源码,如下图:在发现join方法内部其实使用wait方法来实现的,我立即想到了对应的notify/notifyAll方法,当时就想着既然是用wait进行线程休眠,我是不是可以用notify/notifyAll来进行唤醒...原创 2019-06-20 23:56:42 · 2188 阅读 · 0 评论 -
Lock/Condition/Future示例,基于异步通信的同步机制
Java通过Lock类提供了高级的锁特性,它在获取锁的时候可以做更灵活的控制,比如设置获取锁的最长等待时间。Lock可以与多个Condition对象配合,Lock替代synchronized进行共享对象的锁控制,而Condition替代了Object监控方法的使用,Object中的wait/notify/notifyAll方法,可对应Condition中的await/signal/sinallAl...原创 2018-09-09 21:38:53 · 470 阅读 · 0 评论 -
Semaphore示例
java.util.concurrent.Semaphore提供了控制并发的工具类,关键方法是acquire()和release(),它提供一种基于许可的同步机制,初始化一定的许可数量,同步参与者先获取许可,再执行操作,然后释放许可。假如将许可数设置为1,就是一种简单的互斥锁的实现,即同一时间只有一个线程获取到许可。见下面的代码示例:public class TestSemaphore {...原创 2018-08-29 22:36:31 · 282 阅读 · 0 评论 -
Exchanger示例
java.util.concurrent.Exchanger提供了一个在阻塞点用于线程成对交换数据的同步机制。举个简单的例子,两个人一起干浇水的活,用两个水盆,A用盆1盛水,B用盆2浇水。1、A盛满水,等待B将盆2的水用完后和B交换水盆,然后A继续盛水,B继续浇水。2、B将盆2的水用光,则等待A盛满水后交换水盆,然后A继续盛水,B继续浇水。3、在发生交换前两者各自干自己的活,互不干扰,...原创 2018-08-29 21:37:20 · 279 阅读 · 0 评论 -
CountDownLatch示例
java.util.concurrent.CountDownLatch提供了一种同步辅助,可用于控制N个线程一起出发,或者阻塞到N个线程到达。关键方法是await()和countDown(),内部有一个计数器,countDown()将计数器减1,await()方法阻塞到计数器为0为止(其他线程调用countDown()可能将其唤醒),如果await()被调用时计数器已经为0,则该方法直接返回,不会...原创 2018-08-27 21:40:12 · 247 阅读 · 0 评论 -
CyclicBarrier示例
java.util.concurrent.CyclicBarrier提供了一种多阶段协同器的工具,每个阶段都等待固定数目的线程(parties)到达阻塞点(cyclicBarrier.await()),然后执行cyclicBarrier.barrierCommand.run(),并唤醒所有参与者的阻塞状态,进入下一个阶段。为了更好的理解该工具类的使用场景,下面的代码改造自JDK API的示例,目的...原创 2018-08-27 21:18:36 · 178 阅读 · 0 评论 -
简单学:Java.lang.ThreadLocal
最近与人交流Spring是否线程安全的问题,了解到Spring使用了ThreadLocal,出于好奇,简单地学习了一下ThreadLocal类,大道至简,我就说说我认为比较关键的一些地方:1、ThreadLocal封装了一些与当前线程(调用方法时的运行线程)相关的方法,如以下方法分别用于获取对象、设置初始值、设置对象,每个方法都使用了Thread.currentThread()来获取当前运行线...原创 2018-08-21 22:31:28 · 350 阅读 · 0 评论