2015-10-04 80 views
1

Java提供了一個subList函數來獲取指定索引之間的列表視圖,並且由父列表支持,意味着對subList所做的任何更改都將反映在實際列表中。我想知道的是,如果線程嘗試訪問它們,這些子列表是否被父列表鎖定。作爲一個例子,如果我有一個包含100個元素的ArrayList,並且我創建了4個子列表,每個子列表都有25個元素和4個線程嘗試在這些子列表上並行工作,他們是否會以真正並行的方式在它們的獨立子列表上工作或者將執行的第一個線程鎖定後臺數組列表?Java子列表內存分配

如果一個arraylist沒有默認鎖定,我假設線程將在子列表上並行運行,而不用等待對方,如果我以編程方式確保或確切地說邏輯本身確保這些線程從不在其他任何其他線程上工作比他們的子列表,那麼它將真正地平行處理子列表,對吧?

executor.addTask(new Thread(doneSignal, parentList.subList(subListStart, subListEnd))); 

的原因,我想問的是,我試圖遍歷並行的子表,發現它比未創建4個線程和循環在實際父列表慢得多。

+0

你的意思是什麼Java功能? – 2015-10-04 13:47:17

+0

列表。subList(from,to) –

+0

'ArrayList'根本不鎖定。這些線程如何在子列表上工作?他們是閱讀元素,還是設置元素,刪除元素? –

回答

1

,因爲它說的Javadoc for java.util.ArrayList

請注意,此實現不是同步的。如果多個線程同時訪問ArrayList實例,並且至少有一個線程在結構上修改了列表,則它必須在外部同步。

當然,這適用於subList方法。所以,沒有鎖定是由ArrayList本身完成的;你需要自己做,如果你需要它。

+0

我明白了。我用我所關心的問題編輯了我的問題,這似乎與理想情況發生了矛盾。 –

0

我想知道的是,如果線程試圖訪問它們,這些子列表是否被父列表鎖定。

不,他們不會。

... [W]生病,他們在真正的並行方式

是他們的獨立子列表工作。 (除非有其他因素可以抵消並行性。)

我試着並行地遍歷子列表,發現它比創建4個線程和實際父列表循環慢得多。

這可能是其他事情。例如,線程創建開銷,線程池太小,或者在覈心太少時嘗試運行多線程代碼。

另一種可能性是您正在創建同步列表的子列表。如果這樣做,當子列表方法將操作委託給父列表時,這些操作將全部鎖定相同的列表。請注意,它是負責這個的父列表,而不是子列表。