2016-03-18 26 views
0

如清單5.3Java併發 - 樣品5.3

for(int i=0;i<vector.size();i++) 
    doSomething(vecotr.get(i)); 

即使清單5.3可以拋出異常的迭代,這 並不意味着矢量是不threadͲsafe說明。 Vector的狀態是 仍然有效,異常​​其實是在其 規範的一致性。然而,如此的平凡,取最後 元素或迭代的東西拋出一個異常,顯然是不可取的。

上述聲明迭代向量被修改時不清楚me.If,它可以拋出異常,如何Vector的狀態將是有效的

回答

0

它不同步訪問向量,這意味着某些其他線程可以在doSomething訪問它的位置上移除元素的位置,如果我的索引不在邊界內,這會拋出OutOfBoundsException。 BUD,這並不意味着Vector類是不在有效狀態,你只是不想體驗過反覆這種行爲,這就是爲什麼你使用同步,讓在同一時間只能有一個線程訪問它。

因此代碼樣品5.4。

synchronized (vector) { 
for (int i = 0; i < vector.size(); i++) 
doSomething(vector.get(i)); 
} 

客戶端鎖定。

您鎖定矢量

每個對象都有一個與之關聯的內部鎖。按照慣例, 需要一個對象的 領域的排他性和一致的訪問一個線程訪問 之前,獲取物體的內部鎖,然後當它與他們所做的釋放內部鎖。一個 線程說自己已經 獲得鎖和釋放鎖的時間之間的內在鎖。只要一個線程擁有一個內部鎖,其他線程就不會獲得相同的鎖。其他 線程將在嘗試獲取鎖時阻塞。

即使你有一些集合是線程安全的,你可以進入indexOutOfBounds異常,集合的芽狀態將是有效的。