Sync类
- 提供一个阻塞锁和相关同步器(信号量,事件等)框架的实现
- 基于先进先出(FIFO)等待队列
Semaphore
通过计数器控制对共享资源的访问。
eg:创建有信号量计数器为2的信号量
class SmpThread extends Thread {
public Semaphore smp;
public SmpThread(Semaphore smp) {
this.smp = smp;
}
public void run() {
try {
smp.acquire();
System.out.println(Thread.currentThread().getName() + "get 1");
} catch (InterruptedException e) {
e.printStackTrace();
}
smp.release();
System.out.println(Thread.currentThread().getName() + "release 1");
}
}
CountDownLatch
CountDownLatch【倒计时锁】,线程中调用countDownLatch.await()使进程进入阻塞状态,
当达成指定次数后(通过countDownLatch.countDown())继续执行每个线程中剩余的内容。
class CountDownThread extends Thread {
public CountDownLatch cdl;
public CountDownThread(CountDownLatch cdl) {
this.cdl = cdl;
}
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "wait");
cdl.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("I am " + Thread.currentThread().getName());
}
}
CyclicBarrier
- 循环的等待阻塞的线程个数到达指定数量后使参与计数的线程继续执行
- 其他线程仍处于阻塞等待再一次达成指定个数
- 可理解为客车人满发车,余下的一直阻塞
- 过程是循环性的
class CyclicBarrierThread extends Thread {
public CyclicBarrier cb;
public CyclicBarrierThread(CyclicBarrier cb) {
this.cb = cb;
}
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "wait");
cb.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "do");
}
}
Exchanger
Exchanger 用于线程间进行数据交换