1 自定義實現(semphore/阻塞隊列)
首先我們先介紹一下什麼是信號量:
類似於我們去公共澡堂洗澡,需要先去前臺付款拿到儲物櫃的鑰匙,如過沒有空閒的儲物櫃,我們就需要一直等待,直到有別人洗完澡,讓出儲物櫃,這裏的鑰匙就相當於信號量(有限的數量)。
信號量可以使共享變量可被指定數量的線程訪問。
一個計數器,一個等待隊列,三個方法。在信號量模型裏,計數器和等待隊列對外是透明的,所以只能通過信號量模型提供的三個方法來訪問它們,這三個方法分別是:init()、down() 和 up()。
init():設置計數器的初始值。對應於Semahore 中的初始化。
down():計數器的值減 1;如果此時計數器的值小於 0,則當前線程將被阻塞,否則當前線程可以繼續執行。對應於 acquire
up():計數器的值加 1;如果此時計數器的值小於或者等於 0,則喚醒等待隊列中的一個線程(而不是所有線程,如果喚醒所有的線程,此時可能不符合臨界條件),並將其從等待隊列中移除。對應於release
互斥是一種初始值爲1的信號量
public class DataSourcePool {
private final CopyOnWriteArrayList<Connection> list;
//用到了信號量
private final Semaphore semaphore;
public DataSourcePool(int size) throws SQLException {
list = new CopyOnWriteArrayList<>();
semaphore = new Semaphore(size);
for (int i=0;i<size;i++){
Connection connection = DriverManager.getConnection("url");
list.add(connection);
}
}
//使用同步方法獲取
public synchronized Connection getConnection() throws InterruptedException {
//先將當前信號量-1,如果爲0,將阻塞
semaphore.acquire();
return list.remove(0);
}
public synchronized void close(Connection connection){
//信號量+1
semaphore.release();
list.add(connection);
}
2 common pool 實現
可以看下這個博客 https://blog.csdn.net/u013332124/article/details/81042375