2 回答

TA貢獻1802條經(jīng)驗 獲得超10個贊
兩個線程都可以將 的值復制static IntCell n到它們的線程本地存儲中。
使用volatile關鍵字向線程發(fā)出信號以同步線程本地值和共享值。
static volatile IntCell n
另一個問題是原子性失敗,關鍵區(qū)域:
// Thread 1 // Thread 2
temp = n.getN();
temp = n.getN();
n.setN(temp + 1);
n.setN(temp + 1);
使用 sharedn時,n 不會增加 2,而只會增加 1。
synchronize (n) {
temp = n.getN();
n.setN(temp + 1);
}
這確保了一個關鍵區(qū)域阻塞在與 相關聯(lián)的信號量上n。

TA貢獻2041條經(jīng)驗 獲得超4個贊
您沒有使用任何類型的同步,這會導致兩個主要問題:
不能保證一個線程對共享變量所做的更改對另一個線程可見
n
在讀取to的當前值和寫入遞增值之間存在競爭條件temp
- 另一個線程可能已經(jīng)修改了兩者之間的值,然后這將被覆蓋
可能的解決方案包括使用synchronized
-blocks、數(shù)據(jù)包中的鎖java.util.concurrent.locks
或支持原子更新的類型,例如AtomicInteger
添加回答
舉報