我在 Java 中使用二維數(shù)組。但是現(xiàn)在,我想將這個類用于多線程。我怎樣才能做到這一點?我知道如何執(zhí)行線程安全功能(添加同步關(guān)鍵字)。如果同時觸發(fā) clear 和 getItem 函數(shù)會發(fā)生什么?在這種情況下,我該如何做線程安全的實例?public class ThreadSafeArray { int ROW_MAX_COUNT = 1024; int rowCount = 0; int counterForRow = 0; private Object [][] objInstances = new Object[ROW_MAX_COUNT][]; public synchronized void addItem(Object obj) { if(counterForRow == ROW_MAX_COUNT) { objInstances[++rowCount] = new Object[ROW_MAX_COUNT]; counterForRow = 0; } objInstances[rowCount][counterForRow++] = obj; } public synchronized void clear() { objInstances = new Object[ROW_MAX_COUNT][]; rowCount = 0; counterForRow = 0; } public synchronized Object getItem(int index) { int row = index / ROW_MAX_COUNT; int column = index % ROW_MAX_COUNT; if((row <= rowCount) && (column <= counterForRow)) { return objInstances[row][column]; } return null; }}
2 回答

SMILET
TA貢獻1796條經(jīng)驗 獲得超4個贊
在您的代碼中,clear
并且getItem
是實例方法。將同步放在實例方法上意味著線程必須在調(diào)用該方法的對象實例上獲取鎖(“內(nèi)在鎖”),然后線程才能開始執(zhí)行該方法中的任何代碼。
使實例方法同步有兩個效果(來自java指南):
首先,同一對象上的同步方法的兩次調(diào)用不可能交錯。當(dāng)一個線程正在為一個對象執(zhí)行同步方法時,所有其他為同一對象調(diào)用同步方法的線程都會阻塞(暫停執(zhí)行),直到第一個線程處理完該對象。
其次,當(dāng)同步方法退出時,它會自動與任何后續(xù)對同一對象的同步方法調(diào)用建立起之前的關(guān)系。這保證了對象狀態(tài)的更改對所有線程都是可見的。
因此,對于這兩種方法,您的類已經(jīng)是線程安全的。

慕田峪9158850
TA貢獻1794條經(jīng)驗 獲得超7個贊
如果同時觸發(fā) clear 和 getItem 函數(shù)會發(fā)生什么?
一個會等到另一個完成。
在這種情況下,我該如何做線程安全的實例?
它已經(jīng)是線程安全的。
添加回答
舉報
0/150
提交
取消