互斥锁(Mutex)是并发编程中最基本的锁机制之一,它保证同一时刻只有一个线程可以访问共享资源。在Java中,互斥锁的实现主要包括以下几种方式:
### 1. **Synchronized(内置互斥锁)**
`synchronized` 关键字本质上就是一种互斥锁,它确保同一时刻只有一个线程可以执行同步代码块。
**特点:**
- 互斥性:同一时刻只有一个线程可以获取锁。
- 可重入性:同一线程可以多次获取同一把锁。
- 自动释放:线程执行完同步代码块后自动释放锁。
**示例:**
### 2. **ReentrantLock(显式互斥锁)**
`ReentrantLock` 是 `java.util.concurrent.locks` 包提供的显式锁,它提供了更灵活的锁机制。
**特点:**
- 互斥性:同一时刻只有一个线程可以获取锁。
- 可重入性:同一线程可以多次获取同一把锁。
- 可中断性:支持 `lockInterruptibly()` 方法,允许线程在等待锁时被中断。
- 超时获取:支持 `tryLock()` 方法,可以尝试获取锁并设置超时时间。
**示例:** startLine: 12
endLine: 20
### 3. **公平锁 vs 非公平锁**
- **公平锁**:线程按照请求锁的顺序依次获取锁,避免线程饥饿。
- **非公平锁**(默认):线程可能会“插队”获取锁,提高吞吐量,但可能导致某些线程长期无法获取锁。
**示例(创建公平锁):** ReentrantLock lock = new ReentrantLock(true); // true 表示公平锁
### 4. **互斥锁的应用场景**
- 保护共享资源,防止数据竞争。
- 线程安全的计数器、队列等数据结构。
- 需要更灵活的锁控制(如超时、可中断)时,使用 `ReentrantLock`。
### **总结**
互斥锁是并发编程中最常见的锁机制,Java 提供了 `synchronized` 和 `ReentrantLock` 作为主要实现方式。`synchronized` 适用于简单场景,而 `ReentrantLock` 提供了更丰富的功能,如可中断锁、超时锁和公平锁。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |