Java多线程同步工具:Semaphore和Lock的应用案例
在Java中,多线程之间的同步通常使用两种工具:Semaphore(信号量)和Lock(锁)。下面将通过具体应用案例来展示这两种工具的使用。
- Semaphore(信号量)
信号量是一种资源管理机制,它有三种状态:UNLIMITED(无限),POSITIVE(正值),NEGATIVE(负值)。
案例:
Semaphore semaphore = new Semaphore(5); // 创建一个允许最多5个线程同时访问的信号量
// 线程1需要访问资源,但必须等待其他5个线程释放资源
Thread thread1 = new Thread(() -> {
semaphore.acquire(); // 获取资源
System.out.println("Thread 1 executed resources"); // 执行资源
semaphore.release(); // 释放资源
}));
thread1.start();
// 线程2尝试获取资源,但发现已经满5个线程
Thread thread2 = new Thread(() -> {
semaphore.acquire(); // 超过权限
System.out.println("Thread 2 attempted but denied resources due to limit"); // 执行资源(但是失败)
}));
thread2.start();
- Lock(锁)
Lock是Java并发工具包的一部分,用于实现对共享资源的互斥访问。
案例:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class UnlockExample {
private static final Lock lock = new ReentrantLock(); // 使用ReentrantLock
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
try {
lock.acquire(); // 获取锁
System.out.println("Thread 1 executed resources"); // 执行资源
lock.release(); // 释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}));
thread1.start();
// 线程2尝试获取锁并执行资源,但是发现锁已被其他线程占用
Thread thread2 = new Thread(() -> {
try {
lock.acquire(); // 超过权限
System.out.println("Thread 2 attempted but denied resources due to lock in use"); // 执行资源(但是失败)
} catch (InterruptedException e) {
e.printStackTrace();
}
}));
thread2.start();
}
}
总结:
Semaphore和Lock都是Java多线程同步工具,它们分别用于控制同时访问资源的线程数量和实现对共享资源的互斥访问。
还没有评论,来说两句吧...