1. 闭锁:CountDownLatch
1.1 使用场景
若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁。
1.2 代码实现
CountDownLatch latch = new CountDownLatch(2);
Thread t1 = new Thread( new Runnable(){
public void run(){
加载资源的代码……
latch.countDown();
}
} ).start();
Thread t2 = new Thread( new Runnable(){
public void run(){
资源加载代码……
latch.countDown();
}
} ).start();
Thread t3 = new Thread( new Runnable(){
public void run(){
latch.await();
任务代码……
}
} ).start();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
2. 同步屏障:CyclicBarrier
2.1 使用场景
若有多条线程,他们到达屏障时将会被阻塞,只有当所有线程都到达屏障时才能打开屏障,所有线程同时执行,若有这样的需求可以使用同步屏障。此外,当屏障打开的同时还能指定执行的任务。
2.2 闭锁 与 同步屏障 的区别
- 闭锁只会阻塞一条线程,目的是为了让该条任务线程满足条件后执行;
- 而同步屏障会阻塞所有线程,目的是为了让所有线程同时执行(实际上并不会同时执行,而是尽量把线程启动的时间间隔降为最少)。
2.3 代码实现
CyclicBarrier barrier = new CyclicBarrier(3,new Runnable(){
public void run(){
}
});
for( int i=0; i<3; i++ ){
new Thread( new Runnable(){
public void run(){
barrier.await();
任务代码……
}
} ).start();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
3. 信号量:Semaphore
3.1 使用场景
若有m个资源,但有n条线程(n>m),因此同一时刻只能允许m条线程访问资源,此时可以使用Semaphore控制访问该资源的线程数量。
3.2 代码实现
Semaphore semaphore = new Semaphore(3);
for ( int i=0; i<10; i++ ) {
new Thread( new Runnbale(){
public void run(){
semaphore.acquire();
……
semaphore.release();
}
} ).start();
}