java semphore實現 簡單數據庫連接池

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章