為什麼需要執行緒同步?
執行緒同步的問題是在這樣的背景下才衍生的: 記憶體是一個硬體,CPU計算速度比記憶體快很多,程式計算的問題都由CPU來完成的,但不是每次計算,CPU都和記憶體進行資料互動,CPU會先把一些資料寫在快取裡,完成計算的時候,才把結果寫到記憶體裡。所以在多執行緒情況下,可能一個執行緒拿到CPU使用權,已經在計算,但是還沒有完成計算的時候,另一個執行緒對記憶體中同一個資料進行操作,這時候拿到的資料,可能是一個不正確的資料。一個執行緒對共享資料的修改對另一個執行緒而言,可能是不可見的,這就是記憶體的可見性問題。 這時候我們需要考慮執行緒同步的問題。
執行緒同步的方式有哪些?
- 使用synchronized關鍵字 (關於synchronized)
- 使用顯示鎖
- A lock is a tool for controlling access to a shared resource by multiple threads. Commonly, a lock provides exclusive access to a shared resource: only one thread at a time can acquire the lock and all access to the shared resource requires that the lock be acquired first. However, some locks may allow concurrent access to a shared resource, such as the read lock of a ReadWriteLock.Lock(Java Platform SE 7)
- 使用volitile關鍵字
如何在 Java 中正確使用 wait(), notify() 和 notifyAll() – 以生產者消費者模型為例
執行緒間通訊
Sleep(),Await()區別
- 是否釋放鎖的區別,前者不釋放當前執行緒所獲的的鎖,後者釋放鎖並使執行緒進入阻塞狀態。Sleep()是執行緒的方法,呼叫的時候阻塞執行緒,結束後執行緒進入就緒狀態。Await()是Condition的方法。
死鎖發生的條件
比如兩個執行緒間死鎖,各自持有鎖,但是他們都在等待對方的鎖;這樣就發生來死鎖。
複製程式碼
Thanks: