📅  最后修改于: 2023-12-03 15:16:31.009000             🧑  作者: Mango
信号量是一种用于控制多线程并发访问共享资源的技术。它可以限制同时访问某个资源的线程数量,保证线程的安全性。
在Java中,信号量的实现由java.util.concurrent.Semaphore
类提供。该类提供了一组用于操作信号量的方法。
可以使用以下代码创建一个信号量对象:
Semaphore semaphore = new Semaphore(int permits);
permits
参数表示同时允许访问共享资源的线程数量。例如,如果permits
为2,则同一时间最多允许两个线程访问共享资源。
下面是信号量的一些基本操作:
可以使用以下方法获取当前可用的许可数量:
int availablePermits = semaphore.availablePermits();
该方法返回一个整数,表示当前可用的许可数量。
线程通过调用acquire()
方法来获取一个许可,如果没有可用的许可,线程将被阻塞直到有一个许可可用:
semaphore.acquire();
acquire()
方法可能会抛出InterruptedException
异常。
线程使用release()
方法来释放一个许可,使其他等待线程可以获取到许可:
semaphore.release();
可以使用tryAcquire()
方法尝试获取一个许可,如果成功获取到许可,则返回true
,否则返回false
:
boolean acquired = semaphore.tryAcquire();
信号量在多线程编程中有广泛的应用场景,例如:
下面是一个使用信号量的示例代码,用于控制最多两个线程同时访问共享资源的情况:
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private static final int MAX_THREADS = 5;
private static final int MAX_AVAILABLE_PERMITS = 2;
private static final Semaphore semaphore = new Semaphore(MAX_AVAILABLE_PERMITS);
public static void main(String[] args) {
for (int i = 0; i < MAX_THREADS; i++) {
Thread thread = new Thread(new Worker());
thread.start();
}
}
static class Worker implements Runnable {
@Override
public void run() {
try {
semaphore.acquire();
// 执行需要访问共享资源的操作
System.out.println("Thread " + Thread.currentThread().getId() + " is accessing the resource.");
Thread.sleep(2000); // 模拟执行操作的时间
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}
}
}
以上代码创建了5个线程,并通过信号量控制同时访问共享资源的线程数量不超过2个。
信号量是一种用于控制多线程并发访问共享资源的技术。在Java中,可以使用java.util.concurrent.Semaphore
类来实现信号量。通过正确定义许可数量,合理地获取和释放许可,可以实现对共享资源的安全访问。