在Java中,提供了對信號量Semaphore的支持。
Semaphore類是一個計數信號量,必須由獲取它的線程釋放,通常可以用於限制並發訪問的線程數目。
Semaphore的使用
獲得Semaphore對象
public Semaphore(int permits, boolean fair)
permits:初始化可用的許可個數
fair:若該信號量保證在使用時按FIFO(先進先出)的順序,則為true,否則為false;
獲得許可
public void acquire() throws InterruptedException
釋放許可
public void release()
實例如下:
package com.example.lib; import java.util.concurrent.Semaphore; public class MyClass { static Semaphore semaphore = new Semaphore(5,true); public static void main(String[] args){ for (int i = 0; i < 100; i++) { new Thread(new Runnable() { @Override public void run() { test(); } }).start(); } } public static void test(){ try{ //請求一個信號 semaphore.acquire(); System.out.println(Thread.currentThread().getName()+"進來了"); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()+"走了"); //釋放一個信號 semaphore.release(); }catch (Exception e){ e.printStackTrace(); } } }
可以看到,同一時刻最多可以有5個線程訪問test方法,其他的線程就得排隊等待,只能等有信號空閑出來,其他的線程才能進來訪問。
如果不使用信號量,那么所有線程會一股腦的同時訪問test方法,直觀結果如下:
直觀比較之后,可以看到,我們使用Semaphore實現了對並發訪問線程個數的控制。
思考:
在很多情況下,可能有多個線程需要訪問數目很少的資源。假設在服務器上運行着若干個回答客戶端請求的線程。這些線程需要連接同一數據庫,但任一時刻只能獲得一定數目的數據庫連接。要怎樣才能夠有效的將這些固定數目的數據庫連接分配給大量的線程?
答:
1. 給方法加同步鎖,保證同一時刻只能有一個線程去調用此方法,其他線程排隊等待,但是此種情況下即使數據庫連接有10個,也始終只有一個處於使用狀態。這樣會大大浪費系統資源,而且系統的運行效率極其低下。
2.使用信號量。通過信號量控制並發線程的數量 跟數據庫連接個數相同,可以大大提高效率和性能。
注:本文章為轉載文章,轉載處: https://blog.csdn.net/gengbaolong/article/details/90297624