Q1)我創建數據庫連接池的鏈表基於實現。需要使用add()或addFirst()從列表和線程釋放連接的線程需要進行連接輪詢()。在測試過程中,我發現即使一個線程使用synchronized(ll){some code here}鎖定列表,其他線程也能夠從列表中輪詢()出連接。這個測試使我得出結論:只有{}中的代碼塊將被保證一次由1個線程執行,但是對象本身即ll將不會被鎖定,而其他線程仍然可以在其上寫入。那是對的嗎 ??那麼把ll作爲顯示器的用途是什麼? Q2)如果我在創建列表期間使用Collections.synchronizedList()創建鏈接列表爲線程安全,那麼我可以擺脫同步的塊。假設我有2個獨立的方法來獲得連接和釋放連接。目前,這兩種方法都使用同步塊來獲取/釋放連接。synchronized關鍵字沒有鎖定一個鏈表和其它線程仍可從中查詢出來的對象
Q3)如果我決定使用非阻止列表如的ConcurrentLinkedQueue(我們有JDK 1.5)在我們的情況是否會有助於。我們的高峯連接使用率是30,但我們沒有在我們的代碼中施加任何限制,所以連接可以無限增長。我們打算寫一個計時器任務將在夜間運行,並從列表中(舊的連接)的頭關閉一些連接,但是執行業務邏輯,我們更願意用從隊列的尾部連接,因爲這些都是最新發布連接,以便具有非陳舊連接的機會很高。但是由於它是一個fifo隊列,所以我不能從隊列的尾部輪詢()數據,所以我不得不使用隊列頭部的可能不存在的連接。所以基本上我需要的是像執行業務邏輯的特性堆棧,但是像實現定時器任務的特性一樣排隊。任何數據結構,你可以建議。
JDK 1.5? 2016年?另外:1.爲什麼不是'LinkedBlockingQueue'來代替? 2.請顯示一些代碼 – fge
請每個問題只有一個問題。 – Andreas
因爲我們無法等待連接,所以無法使用阻塞隊列,如果我沒有獲得連接,那麼我們寧願創建一個新的連接,而不是等待它。 bcoz我們需要在10秒SLA內回覆ATM機。所以我們對活動連接的數量沒有任何限制,這就是爲什麼我們計劃在午夜運行一些計時器任務以從List/Queue中刪除一些連接,因爲由於TCP /網絡重置,未使用的連接可能會過夜。下面 – Amit