2016-11-28 123 views
0

我有一個1000 * 1000的表和一些線程在它上面工作。每個線程獨立工作在表格的某個部分上,每次迭代時他們的「工作」都會在表格上移動。java中的多線程訪問

而不是鎖定整個表的線程,而其他人正在等待,我想只鎖定每個線程所需的單元格。 所以我正在尋找鎖定每個線程所需的單元「塊」。

我的想法是創建一個鎖表,如:Lock [][]gridLock=new Lock[1000][1000];並鎖定每個線程所需的單元格。

這將配合gridlock(x,y,diameter)gridUnlock(x,y,diameter)方法來鎖定/解除所需單元的時鐘。

有沒有更好的方法來實現這個或者這個方法是否合適?

+1

當然這是可能的,但你應該更清楚地說明你的線程正在做什麼 - 爲什麼不讓每個線程都在表的一行上操作,就是這樣,根本就不需要任何鎖定。 – luk2302

+1

一百萬個鎖可能會變得非常麻煩。 – Kayaman

+1

太寬泛。詳細闡述訪問模式,訪問成本以及「表格」具有哪種數據結構。你的文字建議*數組*或*網格*,而不是表格。同樣非常重要的是確定訪問類型(讀/寫)。你的100萬鎖定方法很可能會非常可怕,以至於單線程會更快。更不用說它巨大的僵局潛力。通過選擇更合適的數據結構,鎖定可能大都可以避免。 TL; DR:棚子裏有很多工具,但不知道問題沒有好的選擇。 – Durandal

回答

0

不鼓勵對單個對象進行併發訪問,因爲這會產生大量問題。最大的是對象可以在線程正在工作時改變狀態,這可以破壞其他線程。

如果可能的話,我會佔用每個線程在它自己的對象上工作,一塊一塊構建表,一旦所有線程完成,構建最終表。這將隔離所有線程並避免不必要的併發問題。

如果上述方法不可行。我會盡量保持線程儘可能獨立,並儘可能隔離表格數據。爲每個線程提供表中的一組行,以確保沒有線程修改表的相同部分。然後每個線程都可以修改分配給它的行中的單元格。

+3

「volatile」表格對象不會有多大幫助,因爲它僅適用於表格的引用,而不是「單元格」。 – Kayaman

+0

@Kayaman我建議該對象是易變的,因爲仍然存在可能被不同線程修改的兩個對象(或者我錯了嗎?)的可能性,而不是因爲它的單元正在被不同的線程修改。 –

+0

可能存在可見性問題,但這將意味着非常低劣的代碼。如果表格對所有線程都可見,則不需要(或者有利於使用)'volatile'。 – Kayaman

0

謝謝!
我不知道我推斷的方式是否正確,但這就是我所做的:
我有我的鎖矩陣像:Lock [] [] gridLock = new Lock [1000] [1000]。

但不是初始化整個1millions鎖定在一開始u_u,我做它需要像時,纔像:

public void lockAround(x, y, diameter){ 
[...] 
for{for{ //i and j <1000 
    gridLock[i][j]=new ReentrantLock(); 
    gridLock[i][j].lock(); 
}} 
} 


我就定他們在unlockAround解鎖時爲空(X ,y,直徑)的方法。

+0

這是不正確的,因爲您對鎖具有與使用該表相同的併發問題。 –