Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 34b2316

Browse files
Merge pull request Snailclimb#77 from Gene1994/master
Update:优化CountDownLantch相关
2 parents 8595908 + d4cd2e3 commit 34b2316

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

‎Java相关/Multithread/AQS.md‎

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,14 +187,16 @@ Semaphore 有两种模式,公平模式和非公平模式。
187187

188188
### 4 CountDownLatch (倒计时器)
189189

190-
CountDownLatch是一个同步工具类,用来协调多个线程之间的同步。这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计时结束,再开始执行
190+
CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,countdownlatch的概念是一个常见的面试题,所以一定要确保你很好的理解了它
191191

192-
#### 4.1 CountDownLatch 的两种典型用法
192+
#### 4.1 CountDownLatch 的三种典型用法
193193

194194
1某一线程在开始运行前等待n个线程执行完毕。将 CountDownLatch 的计数器初始化为n :`new CountDownLatch(n) `,每当一个任务线程执行完毕,就将计数器减1 `countdownlatch.countDown()`,当计数器的值变为0时,在`CountDownLatch上 await()` 的线程就会被唤醒。一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。
195195

196196
2实现多个线程开始执行任务的最大并行性。注意是并行性,不是并发,强调的是多个线程在某一时刻同时开始执行。类似于赛跑,将多个线程放到起点,等待发令枪响,然后同时开跑。做法是初始化一个共享的 `CountDownLatch` 对象,将其计数器初始化为 1 :`new CountDownLatch(1) `,多个线程在开始执行任务前首先 `coundownlatch.await()`,当主线程调用 countDown() 时,计数器变为0,多个线程同时被唤醒。
197197

198+
3死锁检测:一个非常方便的使用场景是,你可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁。
199+
198200
#### 4.2 CountDownLatch 的使用示例
199201

200202
```java
@@ -241,10 +243,24 @@ public class CountDownLatchExample1 {
241243
```
242244
上面的代码中,我们定义了请求的数量为550,当这550个请求被处理完成之后,才会执行`System.out.println("finish");`
243245

246+
与CountDownLatch的第一次交互是主线程等待其他线程。主线程必须在启动其他线程后立即调用CountDownLatch.await()方法。这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。
247+
248+
其他N个线程必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务。这种通知机制是通过 CountDownLatch.countDown()方法来完成的;每调用一次这个方法,在构造函数中初始化的count值就减1。所以当N个线程都调 用了这个方法,count的值等于0,然后主线程就能通过await()方法,恢复执行自己的任务。
249+
244250
#### 4.3 CountDownLatch 的不足
245251

246252
CountDownLatch是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用。
247253

254+
#### 4.4 CountDownLatch相常见面试题:
255+
256+
解释一下CountDownLatch概念?
257+
258+
CountDownLatch 和CyclicBarrier的不同之处?
259+
260+
给出一些CountDownLatch使用的例子?
261+
262+
CountDownLatch 类中主要的方法?
263+
248264
### 5 CyclicBarrier(循环栅栏)
249265

250266
CyclicBarrier 和 CountDownLatch 非常类似,它也可以实现线程间的技术等待,但是它的功能比 CountDownLatch 更加复杂和强大。主要应用场景和 CountDownLatch 类似。

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /