Toc
  1. 线程等待和唤醒的三种方式
  2. Condition
  3. LockSupport
  4. Semaphore
  5. ContDownLatch
  6. CyclicBarrier
Toc
0 results found
BOBO
工具
2020/09/08 Java基础 并发

线程等待和唤醒的三种方式

  1. 方式 1:Object 中的 wait、notify、notifyAll 方法
  2. 方式 2:juc 中 Condition 接口提供的 await、signal、signalAll 方法
  3. 方式 3:juc 中的 LockSupport 提供的 park、unpark 方法

Condition

  • 其中的 await()和 signal()类似于 Object 中的 wait()和 notify()
  • Confition 要配合 Lock 使用;Object 中的 wait()和 notify()要配合 synchronized 使用

关于 Object 和 Condtion 中线程等待和唤醒的局限性:

  1. 让线程等待和唤醒的方法能够执行的先决条件是:线程需要先获取锁
  2. 唤醒方法需要在等待方法之后调用,线程才能够被唤醒

LockSupport

LockSupport 类可以阻塞当前线程以及唤醒指定被阻塞的线程。主要是通过 park()和 unpark(thread) 方法来实现阻塞和唤醒线程的操作的,可以响应 interrupt() 中断。

Semaphore

  • acquire()获取许可,release()释放许可
  • release()放在 finally 中保证能够正常释放
  • release()执行前需要判断下 acquire()是否已经成功,如果 acquire()失败,而 release()成功会使许可数的数量大于初始化时指定的数量
  • Semaphore 默认创建的是非公平的信号量

ContDownLatch

CountDownLatch 称之为闭锁,它可以使一个或一批线程在闭锁上等待,等到其他线程执行完相应操作 后,闭锁打开,这些等待的线程才可以继续执行。确切的说,闭锁在内部维护了一个倒计数器。通过该 计数器的值来决定闭锁的状态,从而决定是否允许等待的线程继续执行。
使用方式:

  1. 创建 CountDownLatch 对象
  2. 调用其实例方法 await() ,让当前线程等待
  3. 调用 countDown() 方法,让计数器减 1
  4. 当计数器变为 0 的时候, await() 方法会返回

CyclicBarrier

CyclicBarrier 通常称为循环屏障。它和 CountDownLatch 很相似,都可以使线程先等待然后再执行。不 过 CountDownLatch 是使一批线程等待另一批线程执行完后再执行;而 CyclicBarrier 只是使等待的线程 达到一定数目后再让它们继续执行。
CyclicBarrier 的计数器可以重置而 CountDownLatch 不行,这意味着 CyclicBarrier 实例可以被重复 使用而 CountDownLatch 只能被使用一次
CyclicBarrier 允许用户自定义 barrierAction 操作,这是个可选操作,可以在创建 CyclicBarrier 对象时指定 。

支付宝
微信
Simple is Awesome