// Java 线程锁示例代码
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadLockExample {
private final Lock lock = new ReentrantLock(); // 创建一个可重入锁
public void performTask() {
lock.lock(); // 获取锁
try {
// 模拟任务执行
System.out.println(Thread.currentThread().getName() + " acquired the lock.");
// 执行临界区代码
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " is working.");
Thread.sleep(100); // 模拟耗时操作
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
lock.unlock(); // 释放锁
System.out.println(Thread.currentThread().getName() + " released the lock.");
}
}
public static void main(String[] args) {
ThreadLockExample example = new ThreadLockExample();
// 创建两个线程,它们将竞争同一个锁
Thread thread1 = new Thread(() -> example.performTask(), "Thread-1");
Thread thread2 = new Thread(() -> example.performTask(), "Thread-2");
thread1.start();
thread2.start();
}
}
Lock 接口:Lock
是 Java 提供的一个接口,用于更灵活地管理线程间的同步。相比 synchronized
关键字,Lock
提供了更多的功能和灵活性。
ReentrantLock 类:ReentrantLock
是 Lock
接口的一个实现,支持可重入锁(即同一个线程可以多次获取同一把锁)。它提供了比 synchronized
更加细粒度的控制。
lock.lock() 和 lock.unlock():在进入临界区之前,线程必须通过 lock.lock()
获取锁;在离开临界区之后,必须通过 lock.unlock()
释放锁。确保在任何情况下(即使发生异常)都能正确释放锁,通常使用 try-finally
块来保证这一点。
线程竞争:在这个例子中,两个线程 Thread-1
和 Thread-2
将尝试执行 performTask
方法。由于该方法中有锁的存在,同一时间只有一个线程能够执行临界区的代码,另一个线程必须等待锁被释放后才能继续执行。
上一篇:deque java
下一篇:java判断list中的重复数据
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站