执行进程时,信号量用于控制对共享资源的访问。这是在计数器的帮助下完成的。当此计数器值大于0时,将提供对共享资源的访问。另一方面,如果counter的值为零,则拒绝访问共享资源。计数器基本上记录了它对共享资源所授予的许可数。这意味着,信号量提供对线程共享资源的访问。
信号量存在于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; } }
“接受”方法用于发送存储在信号量内部的信号。'give_it'函数等待信号。当该功能接收到信号时,其标志被清除,并且控制从该功能退出。以这种方式使用信号量,不会丢失任何信号。