2013-08-20 7 views
0

1)如果內部靜態Runnable類在外部單例中修改了一個靜態的ConcurrentHashMap,在它調用Callable之後有可能會阻止它?我正在考慮通過多個可運行同時對地圖中的同一項進行修改的場景。多個runnables在外部單例中的靜態ThreadPoolExecutor中運行。如果用作可調參數的包裝,如果它修改單例的靜態參數,那麼內部靜態是否可以在單例塊中運行?

2)如果我做了val = myCallable.call(),那麼在可運行的相同Thread中調用可調用函數嗎?它根據可調用的結果修改同時發生的映射。

回答

1
  1. ConcurrentHashMap被設計爲非阻塞的,雖然一些競爭是可能的,如果多個更新到相同的散列段同時發生。
  2. 是的。
+0

我的錯誤,我正在使用ConcurrentHashMap。 – Saad

+1

'ConcurrentHashMap'是非阻塞的。但是,如果您的線程都更新了地圖上的同一個鍵,則會遇到爭用。 –

+0

我讀了一些關於concurrenthashmap的內容。它在各種鑰匙桶上使用32個鎖。所以我理解你關於爭用的觀點,如果它是同一個關鍵。在這種情況下,這些線程會根據到達時間排隊嗎?只是好奇。 – Saad

1
  1. 除了運行靜態初始化器時,Java永遠不會隱式地阻塞。

  2. call()是一個普通的方法調用,並將在調用線程中同步運行,就像任何其他方法調用一樣。

+0

我正在用一些參數新建靜態內部類,並將它傳遞給for循環中的threadpoolexecutor。 runnables可以同時運行嗎?我已經編寫了一個端到端的測試來測試這個服務,我可以修改它以測試這些調用是否是併發的(通過在我的包裝可調參數中引入睡眠,並查看多個可運行的服務是否需要相同的時間作爲其中之一)。 – Saad

+0

@SaadShakil Runnables是否同時運行取決於執行器的設置方式(例如,'Executors.newSingleThreadExecutor'將按順序運行任務),但一般來說,假設您沒有使用異常執行器,那麼您的任務應該同時運行。 –

+0

使用具有多個預啓動線程的'ScheduledThreadPoolExecutor';沒什麼大不了。值得關注的是靜態內部可運行的原因有兩個:1)作爲一個靜態內部類,它是否會在我的for循環中被「重複使用」?不過,我確實用幾個參數對它進行了新的修改。也就是說,它的run方法會在循環中執行一次(不管它是否被新建),所以被包裝的可調參數在執行時會被延遲。現在我想起來了,如果我在循環中調用可調用函數,情況也是如此。 2)@ ChrisJester-Young指出的爭用 – Saad

相關問題