java同步器原理与特点

java同步器原理与特点

CountDownLatch

原理:CountDownLathch是基于AQS(抽象队列同步器)实现的,在初始化CountDownLatch对象时设置计数器count,并保存在AQS的同步状态变量state里,当线程调用CountDownLatch对象的await()方法时,线程被放入到AQS的阻塞队列,当线程调用CountDownLatch对象的countdown()方法时原子性递减并更新(CAS)计数器count,当count值为0时,调用AQS的doRelaseShared方法激活AQS阻塞队列中的线程。
特点:可以在子线程运行的任何时候让await方法返回而不一定等到线程运行完毕;当让线程池管理线程时,无法使用join方法;因此相比于join方法更加灵活。

CyclicBarrier

原理:CyclicBarrier是基于ReentrantLock实现的,ReentrantLock是基于AQS实现的。在初始化CyclicBarrier对象时设置线程个数值parties和Runnable接口对象。当线程调用CyclicBarrier对象的await()方法时,内部会调用dowait方法(核心方法),具体为线程会获得ReentrantLock对象的锁资源,并进行计数器count的递减操作,若count值不为0,线程会被阻塞挂起放入条件变量trip的条件阻塞队列并释放锁资源。当count值为0时,调用nextGengration()方法唤醒条件队列里的阻塞线程并利用parties重置count,实现CyclicBarrier对象状态重置。
特点:满足计数器重置的需要。

Seamphore

原理:Seamphore是基于AQS实现的,在初始化Seamphore对象时设置信号量个数permits,并保存在AQS的同步状态变量state里,当线程调用Seamphore对象的acquire()系列方法时,会首先获取Seamphore对象的当前信号量state,然后与acquire方法需要的信号量(默认为0)作差,当差值小于0时,线程被放入AQS阻塞队列而被阻塞挂起。当线程调用Seamphore对象的release()系列方法时,会把Seamphore对象的当前信号量值state递增,当state大于acquire方法需要的信号量时,调用unpark方法唤醒因调用acquire方法而被阻塞的线程。
特点:一个是用于多个共享资源的互斥使用,另一个是用于并发线程数的控制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值