2017-05-27 43 views
0

我有一個數組,其大小在執行我的程序期間不會改變。比方說,有正在改變這個數組的內容多線程,像迭代線程之間共享的數組

array[validIndex] = new Entity(); 

是否可以安全通過這樣的陣列迭代在任何時間點?假設我不關心數組中「內部」的對象。

+0

在讀取和寫入陣列是原子,從我記得數組元素不揮發,所以一個線程可能不會馬上(或者根據你的程序結構的話)看到另一個線程中完成的變化。如果這是一個問題,你可以使用像AtomicReferenceArray'' AtomicIntegerArray'這樣的類或者使用synchronized塊。 – Pshemo

+2

如果你不關心裏面的對象,爲什麼你會遍歷整個數組? – user2357112

+1

@ user2357112顯然我想訪問它們,我想說的是它們的順序無關緊要,我對陣列的任何特定「快照」都不感興趣。 – user3763116

回答

2

Java中的數組大小不會改變......有史以來。

通過遍歷數組基本上是通過數組索引循環和各項指標在得到元素 - 不管你做明確的,或者你用閃亮for(Entity e: array) ...語法 - 所以沒有辦法迭代本身就會出問題,甚至隨着陣列內容的變化。

您將在迭代中看到的對象可能不會在任何給定的時間點構成數組內容的有效「快照」,但據我所知,這不是您的問題案件。

+0

這是一個沒有數組訪問同步的問題。考慮一個場景,其中數組的所有賦值都在線程'A'中,並且數組中的所有讀取都在線程'B'中。除非有某種同步,否則線程'B'可能總是隻能看到'null'值,不管線程'A'存儲了多少個引用。 –

+0

@Lew Bloch首先,OP表示他們「不關心在數組內」的對象,所以任何一致性點都是沒有意義的。另一方面,我既不完全理解你的例子,也不想象它可能與同步有關。 – shinobi

+0

線程之間沒有任何_happens-before_點,它們之間不能保證內存可見性。理論上,線程'A'可以完成對任何或全部數組元素的寫操作,並且其他線程不會看到寫入的值,而只能看到數組的初始狀態。如果沒有某種形式的同步,程序就無法建立必要的_happens-before_障礙。這是否爲你澄清,@shinobi? –

0

可以使陣列線程安全的,如下所示:

列表arryList =新的ArrayList(); list arratListNew = Collections.synchronizedList(arrayList);

//這裏arratListNew將是線程陣列。

+0

ArrayList不是數組。 – user3763116