Java多线程之Semaphore
程序员文章站
2022-07-13 16:43:47
...
Semaphore(信号量),是用来控制同时访问特定资源的线程数量,它通过计数来协调各个线程,以保证合理的使用公共资源。我的理解是:信号量控制着一个线程池中并发线程的数量。就好像我们去一家饭店吃饭,这家饭店最多可以同时供应50人,如果饭店中已经坐满50人,这时新来的客人就必须等待,直到有客人离开他们才可以进入,并且总的数量不可以超过50人。这里饭店就好比线程池,饭店里的服务人员和厨师就好比共享的资源,每个客人都相当于一个线程, semaphore就记录着里面的人数,要根据semaphore的数量来决定是否让新的客人进入。为了得到一个资源,每个线程都要先获取permit,以确保当前可以访问。
Semaphore类中有几个重要的方法,
构造函数:
1,Semaphore(int permits)
在这个方法中只有一个int的参数,记录着可用permit的数量,没有fair参数,它能保证排队中的线程得到permit的顺序,我们可以把它用于synchronization机制中,共同来协调各个线程。当把参数初始化为负数时,代表必须先调用release方法。
2,Semaphore(int permits, boolean fair)
这个构造方法中多了一个布尔型的参数fair,当我们设定为true时,semaphore可以保证各个线程获取permit的顺序,符合FIFO原则,就是谁先调用acquire方法谁先得到permit;当设定为false时,则不能保证这个顺序,后调用acquire的线程可能比等待中的线程更早的得到permit.
其他方法:
1,acquire()方法
线程通过acquire方法线程请求得到permit,如果semaphore显示有可用的permit,这个线程就得到了一个permit,从而可以访问共享数据,信号量中的permit总数要减掉一个。当现在没有permit可用时,当前的线程就进入阻塞状态,直到有可用的permit,或者其他线程中断了当前线程。
2,release()方法
当一个线程执行结束,我们用release()方法来释放这个permit重新回到semaphore中。从而其它正在等待中的线程可以得到permit。我们一般
3,availablePermits()方法
返回当前可用的permit的数量。
4,hasQueuedThreads()方法
查询是否有线程正在等待获取一个permit。
Semaphore类中有几个重要的方法,
构造函数:
1,Semaphore(int permits)
在这个方法中只有一个int的参数,记录着可用permit的数量,没有fair参数,它能保证排队中的线程得到permit的顺序,我们可以把它用于synchronization机制中,共同来协调各个线程。当把参数初始化为负数时,代表必须先调用release方法。
2,Semaphore(int permits, boolean fair)
这个构造方法中多了一个布尔型的参数fair,当我们设定为true时,semaphore可以保证各个线程获取permit的顺序,符合FIFO原则,就是谁先调用acquire方法谁先得到permit;当设定为false时,则不能保证这个顺序,后调用acquire的线程可能比等待中的线程更早的得到permit.
其他方法:
1,acquire()方法
线程通过acquire方法线程请求得到permit,如果semaphore显示有可用的permit,这个线程就得到了一个permit,从而可以访问共享数据,信号量中的permit总数要减掉一个。当现在没有permit可用时,当前的线程就进入阻塞状态,直到有可用的permit,或者其他线程中断了当前线程。
2,release()方法
当一个线程执行结束,我们用release()方法来释放这个permit重新回到semaphore中。从而其它正在等待中的线程可以得到permit。我们一般
3,availablePermits()方法
返回当前可用的permit的数量。
4,hasQueuedThreads()方法
查询是否有线程正在等待获取一个permit。