📜  Java中的信号量(1)

📅  最后修改于: 2023-12-03 15:16:31.009000             🧑  作者: Mango

Java中的信号量

什么是信号量?

信号量是一种用于控制多线程并发访问共享资源的技术。它可以限制同时访问某个资源的线程数量,保证线程的安全性。

Java中的信号量实现

在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类来实现信号量。通过正确定义许可数量,合理地获取和释放许可,可以实现对共享资源的安全访问。

参考链接:Semaphore (Java Platform SE 11)