Java中的信号量
信号量用于在执行进程时控制对共享资源的访问。这是借助计数器实现的。当此计数器值大于0时,允许访问共享资源。另一方面,如果计数器值为零,则拒绝访问共享资源。计数器基本上记录它已授予共享资源的权限数量。这意味着信号量为线程提供对共享资源的访问。
- 信号量位于java.util.concurrent包中。信号量的概念是隐式实现的。
- 如果信号量的计数大于0,则线程可以访问共享资源。信号量的计数将同时递减。否则,如果信号量的计数不为0,则线程将被阻止访问共享资源,直到信号量释放其他线程的访问权限。当线程不需要共享资源时,它会放弃其权限。此时,信号量的计数将递增。如果另一个线程也需要访问共享资源,它可以竞争访问共享资源。
示例
以下是一个示例:
public class Demo { private boolean my_signal = false; public synchronized void accept() { this.my_signal = true; this.notify(); } public synchronized void give_it() throws InterruptedException { while(!this.my_signal) wait(); this.my_signal = false; } }
“accept”方法用于发送存储在信号量中的信号。“give_it”函数等待信号。当此函数接收到信号时,其标志被清除,控制从该函数退出。以这种方式使用信号量,不会丢失任何信号。
广告