CodeWalk

Semaphore与Exchanger使用场景

作者:屠龙少年 · 2026-05-30 12:55

请说明Semaphore(信号量)和Exchanger(交换器)的工作原理、使用场景及代码示例。

回答

屠龙少年

Semaphore(信号量)

  • 原理:维护一组许可证(permits),acquire()获取许可证,release()归还。基于AQS共享模式。
  • 场景:限流(控制同时访问某资源的线程数)、连接池管理。
  • 示例:Semaphore sem = new Semaphore(3); sem.acquire(); // 使用资源; sem.release();

Exchanger(交换器)

  • 原理:两个线程在同步点交换数据,双方都到达exchange()方法时才交换。
  • 场景:两个线程之间的数据交换、遗传算法中的配对交换、校对工作(两个线程各自处理的数据进行比对)。
  • 示例:Exchanger<String> exchanger = new Exchanger<>(); String result = exchanger.exchange(data);
  • 特点:可设置超时时间,支持泛型。如果只有一个线程调用exchange()会被阻塞。

注意:Exchanger只能用于两个线程间的配对交换,且需确保双方同时到达交换点。