
多线程
希望之光芒
风一样的速度,风一样的自由
展开
-
Java技术之AQS详解
AQS是AbstractQueuedSynchronizer的简称。AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架,如下图所示。AQS为一系列同步器依赖于一个单独的原子变量(state)的同步器提供了一个非常有用的基础。子类们必须定义改变state变量的protected方法,这些方法定义了state是如何被获取或释放的。鉴于此,本类中的其他方法执行所有的排队和阻塞机制。子类...转载 2019-12-04 17:38:53 · 325 阅读 · 0 评论 -
Java中死锁的定位与修复
死锁应该可以说是并发编程中比较常见的一种情况,可以说如果程序产生了死锁那将会对程序带来致命的影响;所以排查定位、修复死锁至关重要;我们都知道死锁是由于多个对象或多个线程之间相互需要对方锁持有的锁而又没有释放对方所持有的锁,导致双方都永久处于阻塞状态;如上图所示,线程1持有对象1的锁、线程2持有对象2的锁,持此线程1又想去获取对象2对象锁、线程2想获取对象1对象锁,此时由于双方都没有...转载 2019-12-04 14:43:32 · 314 阅读 · 0 评论 -
认真的讲一讲:自旋锁到底是什么
什么是自旋锁?自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。Java如何实现自旋锁?下面是个简单的例子:/*** Date: 2016年1月4日 下午...转载 2019-12-03 17:40:10 · 253 阅读 · 0 评论 -
Java多线程(ExecutorService), 等待所有线程执行完毕.
第一种方式:来自大神cletus的回答,原文链接ExecutorService taskExecutor = Executors.newFixedThreadPool(4);while(...) { taskExecutor.execute(new MyTask());}taskExecutor.shutdown();try { taskExecutor.awaitT...转载 2019-12-03 16:13:01 · 2542 阅读 · 0 评论 -
Java 线程池主线程等待子线程awaitTermination方法使用详解
Java中在使用Executors线程池时,有时场景需要主线程等各子线程都运行完毕后再执行。这时候就需要用到ExecutorService接口中的awaitTermination方法,我们来看看源码中对该方法的说明:大概意思是这样的:该方法调用会被阻塞,并且在以下几种情况任意一种发生时都会导致该方法的执行:即shutdown方法被调用之后,或者参数中定义的timeout时间到达或者...转载 2019-12-03 15:56:17 · 1809 阅读 · 0 评论 -
多线程:当你提交任务时,线程队列已经满了,这时会发生什么?
本文基于JDK1.8源码进行分析当我们调用Executors.newFixedThreadPool(intnThreads )时会创建一个线程池给我. 源码这个方法的实现是:public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThre...转载 2019-12-03 14:54:57 · 740 阅读 · 0 评论 -
倒计时器:CountDownLatch
CountDownLatch是一个非常实用的多线程控制工具类。常用的就下面几个方法:CountDownLatch(int count) //实例化一个倒计数器,count指定计数个数countDown() // 计数减一await() //等待,当计数减到0时,所有线程并行执行CountDownLatch在我工作的多个场景被使用,算是用的很频繁的了,比如我们的API接口响应时间被要...转载 2019-11-11 02:37:55 · 156 阅读 · 0 评论