2016-02-29 20 views
0

Q1)我創建數據庫連接池的鏈表基於實現。需要使用add()或addFirst()從列表和線程釋放連接的線程需要進行連接輪詢()。在測試過程中,我發現即使一個線程使用synchronized(ll){some code here}鎖定列表,其他線程也能夠從列表中輪詢()出連接。這個測試使我得出結論:只有{}中的代碼塊將被保證一次由1個線程執行,但是對象本身即ll將不會被鎖定,而其他線程仍然可以在其上寫入。那是對的嗎 ??那麼把ll作爲顯示器的用途是什麼? Q2)如果我在創建列表期間使用Collections.synchronizedList()創建鏈接列表爲線程安全,那麼我可以擺脫同步的塊。假設我有2個獨立的方法來獲得連接和釋放連接。目前,這兩種方法都使用同步塊來獲取/釋放連接。synchronized關鍵字沒有鎖定一個鏈表和其它線程仍可從中查詢出來的對象

Q3)如果我決定使用非阻止列表如的ConcurrentLinkedQueue(我們有JDK 1.5)在我們的情況是否會有助於。我們的高峯連接使用率是30,但我們沒有在我們的代碼中施加任何限制,所以連接可以無限增長。我們打算寫一個計時器任務將在夜間運行,並從列表中(舊的連接)的頭關閉一些連接,但是執行業務邏輯,我們更願意用從隊列的尾部連接,因爲這些都是最新發布連接,以便具有非陳舊連接的機會很高。但是由於它是一個fifo隊列,所以我不能從隊列的尾部輪詢()數據,所以我不得不使用隊列頭部的可能不存在的連接。所以基本上我需要的是像執行業務邏輯的特性堆棧,但是像實現定時器任務的特性一樣排隊。任何數據結構,你可以建議。

+1

JDK 1.5? 2016年?另外:1.爲什麼不是'LinkedBlockingQueue'來代替? 2.請顯示一些代碼 – fge

+1

請每個問題只有一個問題。 – Andreas

+0

因爲我們無法等待連接,所以無法使用阻塞隊列,如果我沒有獲得連接,那麼我們寧願創建一個新的連接,而不是等待它。 bcoz我們需要在10秒SLA內回覆ATM機。所以我們對活動連接的數量沒有任何限制,這就是爲什麼我們計劃在午夜運行一些計時器任務以從List/Queue中刪除一些連接,因爲由於TCP /網絡重置,未使用的連接可能會過夜。下面 – Amit

回答

0

同步不鎖定的對象。它鎖定了在同一個對象上同步的代碼段。如果其他代碼段使用同一個對象而沒有同步它們,它們將繼續。

+0

國際海事組織,說「[同步]鎖定代碼段」對noobs沒有幫助。原因是,_code_不是需要保護的東西。需要保護的是_data_。 Noobs需要明白,編碼者的責任是確保某個鎖對象與任何需要保護的數據結構相關聯,並確保依賴於該數據結構的各種代碼塊在同一個鎖對象上同步。 –

0

OK,你有一些名單:

LinkedList ll = ...; 

同步上ll防止其他線程訪問列表或修改列表:

synchronized(ll) { 
    ...protected code... 
    // This does NOT prevent other threads from examining or updating 
    // ll while the protected code runs. 
} 

一個​​唯一阻止是,它阻止其他線程同時在同一個對象上同步。

原因同步一些數據結構像一個鏈表是爲了防止其他線程看到處於無效狀態的結構,當一個線程必須以完成其工作創建一個臨時的無效狀態。

爲了使其工作,該代碼創建的臨時狀態不好塊必須同步,並且必須從看到壞的狀態下防止代碼每個塊也必須在同一對象上同步。


這是無用的,因爲沒有其他的線程將永遠被允許在ll同步:

public void run() { 
    synchronized(ll) { 
     while(true) { 
      ... 
     } 
    } 
} 

通常你想保持​​塊儘可能短:你想要的代碼來獲得快速退出以最小化其他線程等待輪到的時間。

+0

感謝@詹姆斯,這回答我的第一個問題,你能否看看剩下的兩個也與相同的用例有關,我需要一個類似deque的特性,但項目在Java5上運行,並且沒有帶寬遷移到給出這個數據結構的Java7。 – Amit

+0

@amit,Re'Collections.synchronizedList()'。這就像我上面所說的:同步_anything_的原因是爲了防止其他線程看到處於臨時無效狀態的數據。 'Collections.synchronizedList()'給你一個完全同步的代理,用於你選擇的'List'對象。如果唯一重要的是保護列表免受侵害,那麼這應該就足夠了。但是,如果您的程序依賴於列表中的內容與任何其他數據結構之間的某種關係,那麼您可能需要一個涵蓋兩個結構的鎖。 –

+0

Re Deques,快速谷歌搜索應該提供大量關於如何實現雙端隊列的示例。 –

相關問題