同步:并发的线程在某一关键点上可能需要相互等待通知或互通消息,这种机制叫线程同步。
他们几个底层实现都是AQS,是jdk并发包里提供的并发工具类,注意,他们是工具类,跟我们平时自己写的或使用的工具类一样,目的是帮助我们处理并发的流程控制或解决我们多线程时遇到的一些问题(如:多线程互相等待通知、模拟并发等)
CountDownLatch
可以让线程等待其他线程完成操作后自己再干。
它跟join类似,可以让主线程暂停子线程先去执行;它又比join灵活,join只能是子线程完全执行完才会通知主线程,countDownLatch可以让子线程在任意时刻显示通知主线程,主线程接到通知后可以跟子线程一块执行;实现功能又可以跟FutureTask差不多,FutureTask可以返回子线程处理任务的状态,主线程里不断的while循环判断判断子线程状态是否是done,这种方式占用的是cpu资源,因为他要忙循环不断检查所有子线程都处理完,countDownLatch的实现机制是主线程暂停后就“挂起”了,释放了cpu,等所有子线程完成后再通知主线程,这种方式引起线程间上下文切换,耗性能。
用法:
public class CountDownLatchTest {
public static void main(String[] args) {
CountDownLatch taskLock = new CountDownLatch(3);
Thread thread1 = new Thread(()->{
String name = Thread.currentThread().getName();
System.out.println(name+":处理业务");
taskLock.countDown();
System.out.println(name+":调用完毕释放资源,同步状态剩余:"+taskLock.getCount());
},"Thread-1");
Thread thread2 = new Thread(()->{
String name = Thread.currentThread().getName();
System.out.println(name+":处理业务");
taskLock.countDown();
System.out.println(name+":调用完毕释放资源,同步状态剩余