2011-08-02 66 views

回答

10

是什麼意思,當我們說一個ArrayList不同步?

這意味着,從多個線程訪問的ArrayList實例可能是不安全的(讀「可能會導致意外的行爲」或「可能無法正常工作像宣傳的那樣」)。

進一步閱讀:

這是否意味着,如果我們宣佈在對象範圍內的ArrayList,多個線程訪問的對象必須修改列表中的機會呢?

即使這本來是線程安全的,多線程將能夠修改列表。

不同的是,如果它不是線程安全和多線程訪問列表,全盤皆輸。說這個類不是線程安全的,就像在每個方法描述之前添加「如果一次從一個線程訪問,該方法的工作原理如下.....」。

1

這是否意味着如果我們在對象範圍中聲明一個ArrayList,訪問這些對象的多個線程是否有機會修改這個列表?

是的。如果多個線程同時操作就可以了,它可能會導致意外的行爲

1

這意味着ArrayList的實例不保證是線程安全的。這通常包括讀取和寫入訪問。如果你在沒有外部同步的情況下做到這一點,你可以將對象置於正常狀態並且難以調試。

0

正在同步意味着每一個操作是線程安全的 - 如果你使用來自兩個線程在同一數組列表在同一時間,他們不能破壞狀態。但是,這會讓它變慢。

默認的ArrayList不同步,就可以實現了由同步關鍵字

ArrayList al=new ArrayList(); 

Collections.synchronized(al); 
2

同步或不同步,一個ArrayList總是可以被多個線程修改。同步是關於防止併發訪問。

隨着ArrayList的(或一般類別)有兩個併發問題。

第一個,有方法同步。這意味着,所有對ArrayList實例的方法的調用都是同步的。因此,一次只能執行一個方法。在第一種方法仍在計算時發生的所有其他方法調用將排隊,直到運行方法完成。

List list = Collections.synchronizedList(new ArrayList()); 

例:

方法同步可以通過包裝這樣一個ArrayList保證假設兩個線程嘗試做在同一時間如下:如果你有一個同步的

list.add(0, "test"); 

列表中,保證列表後綴以兩個「測試」條目開頭。如果列表不同步,則可能只有一個「測試」條目或其他意外結果。

第二,有實例同步。這裏我們不僅阻止併發方法調用,但我們確保一次只有一個線程可以訪問列表對象。如果你有一些邏輯要求列表保持不變的狀態,直到邏輯完成,這很重要。例如迭代列表。您不希望其他線程在迭代列表時添加元素。

這種同步是通過用同步塊包裹你的邏輯塊進行:

synchronized(list) { 
     for (Object o:list) { 
     ... 
     } 
} 
相關問題