java 线程池加锁用法
时间: 2024-07-24 14:01:14 浏览: 130
线程池的执行步骤-Java并发编程实践分享
在 Java 中,线程池通常用于管理和调度一组工作线程,以便高效地执行任务。当线程池内部的任务需要访问共享资源,如数据库、文件或某个变量,并且需要保证数据的一致性和并发控制时,就需要使用锁机制。
`java.util.concurrent` 包下的 `ExecutorService` 提供了线程池功能,而对共享资源的保护一般通过 `synchronized` 关键字或者更高级的同步工具比如 `ReentrantLock` 或 `Semaphore` 实现。以下是使用 `synchronized` 和 `ReentrantLock` 的简单示例:
1. **使用 synchronized**:
```java
public class SharedResource {
private int sharedValue;
public synchronized void increment() {
sharedValue++;
}
}
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Future<?> future = executor.submit(new Task(sharedResource));
}
```
在这里,`increment` 方法被 `synchronized`,这意味着在同一时间只有一个线程可以执行这个方法,实现了简单的互斥访问。
2. **使用 ReentrantLock**:
```java
import java.util.concurrent.locks.ReentrantLock;
public class LockBasedTask {
private final ReentrantLock lock;
private volatile int sharedValue = 0;
public LockBasedTask() {
lock = new ReentrantLock();
}
public void increment() {
lock.lock();
try {
sharedValue++;
} finally {
lock.unlock();
}
}
}
```
`ReentrantLock` 更具灵活性,允许更复杂的锁定策略,并提供条件判断等高级功能。在上面的例子中,`lock.lock()` 获取锁,`unlock()` 释放锁。
阅读全文