2012-03-14 140 views
0

所以我有一個SomeTaskextends Thread,具有MapList領域。當你沒有做Collections.synchronizedXXX並且你有多個SomeTask線程正在運行時,會有什麼行爲?Java併發性:我應該同步所有List和Maps嗎?

一旦地圖是從數據庫調用(我使用對象數據庫直接存儲POJO),我需要同步的Map對象從該數據庫返回呢?

Map SomeTasksOwnMap = Collections.synchronizedMap(MapReturnedFromDatabase);

+0

但不是每個線程都得到它自己的Map實例嗎? – KJW 2012-03-14 03:44:55

+0

@KimJongWoo - 當然他們沒有。無論給你什麼想法? – 2012-03-14 03:48:38

+1

盲同步是......盲目的。不要這樣做。考慮線程邊界以及數據如何移動。 – 2012-03-14 03:54:17

回答

1

Collections.synchronizedXXX當2級或更多的線程訪問相同的地圖/列表是必需的。

如果您的任務不能訪問其他任務地圖/列表,那麼就沒有必要對他們進行同步。

例子。

  • 任務1建立正是由2
  • 任務2整除的號碼清單建立正是由3

整除的數的列表,這兩個任務具有不要求同步個人名單。

示例需要同步。

  • 任務1和2都計算數字並將它們存儲在共享列表中。

要回答以下問題:「當你不這樣做時會有什麼行爲」,如果兩個線程想要寫入索引'x',則可能會丟失其中一個寫入。

由於在寫入位置之前數組的大小已增加,因此在列表中也可能具有空值。

基本上你會有不一致的看法。

1

號有沒有在你的疑問,建議是必需的,因爲據我可以告訴每個線程讀取內本身只數據同步:您只需要同步時,在其他線程的線程訪問數據。

另外,有SomeTask extends Thread是一個糟糕的設計 - 它應該extends Runnable,然後使用new Thread(new SomeTask()).start()

+0

啊是的。感謝那。 – KJW 2012-03-14 03:48:25

0

...我應該同步全部列表和地圖?

不,你不應該。同步不需要它的東西是浪費資源。對於需要同步的事情,您需要以正確的方式進行。 (並且synchronizedXxx包裝並不總是正確的方法。)

首先,您需要確定將對多個線程可見的數據結構。可證明線程受限的數據結構完全不需要同步。

其次,你需要檢查的數據結構來看看一個synchronizedXxx包裝是足夠的方式。例如,這些包裝器不會同步迭代,如果一個線程更改集合而另一個線程正在迭代集合,則可能會遇到麻煩。

最後,您需要考慮同步數據結構是否被不同線程大量使用。如果數據結構被大量使用,則包裝會導致性能瓶頸。如果是這種情況,則應考慮使用ConcurrentYyyy類之一。