信号(Signal) vs 信号量(Semaphore)
- 信号 = 异步通知、事件提醒(告诉你"发生了什么事")
- 信号量 = 同步互斥、计数器(控制"能不能用、几个人用")
完全不是一个东西,只是名字像。
1. 信号(Signal)
作用:进程之间发"事件通知"
- 软中断,异步机制
- 只传事件编号,不传复杂数据
- 典型:kill、Ctrl+C、程序异常
例子
SIGINT(2):Ctrl+C 中断SIGKILL(9):强制杀死进程SIGUSR1:用户自定义信号
Java 里怎么用
- 只能通过
sun.misc.Signal或 JVM 参数处理 - 一般用来优雅关闭、重启、通知
2. 信号量(Semaphore)
作用:控制资源并发访问、同步互斥
- 一个计数器
- 控制多少个线程/进程能同时进入临界区
- 用于锁、限流、同步
例子
- 二元信号量(0/1)= 互斥锁
- 计数信号量(5)= 最多 5 个并发
Java 里就是
java
Semaphore semaphore = new Semaphore(5); // 最多5个
semaphore.acquire(); // 拿许可
semaphore.release(); // 还许可
3. 核心区别(面试必背)
| 对比项 | 信号 Signal | 信号量 Semaphore |
|---|---|---|
| 功能 | 异步事件通知 | 同步/互斥、并发控制 |
| 数据 | 只传信号编号 | 计数器(许可数) |
| 机制 | 异步、中断式 | 同步、阻塞/非阻塞 |
| 用途 | 杀进程、重启、通知 | 锁、限流、共享资源保护 |
| 典型场景 | Ctrl+C、kill、异常 | 限流器、生产者消费者 |
| 是否传数据 | 不传递业务数据 | 不直接传数据,只做控制 |
4. 最简单记忆法
- 信号 = 门铃:响一下告诉你"有事"
- 信号量 = 门禁:控制几个人能进房间