1
java的synchronized塊就像windows臨界區或互斥鎖一樣:一次只能有一個線程進入它。
但是有一個區別:當你在synchronized塊中調用wait()時,其他線程可以進入塊。不知道如何在winapi中做同樣的事情。winapi模擬java的synchronized/wait()
這不是一個解決方案:
LeaveCriticalSection();
// Something important may happen between these calls
WaitForSingleObject();
的Java:
Thread 1 Thread 2 Thread 3
1
2 synchronized {
3 wait
5 synchronized {
6 notifyAll
7 }
4 }
8 synchronized {
9 wait
10 }
11 continue not continue
雷米的變種:
Thread 1 Thread 2 Thread 3
1 EnterCriticalSection
2 ResetEvent
3 LeaveCriticalSection
4 EnterCriticalSection
5 SetEvent
6 LeaveCriticalSection
7 EnterCriticalSection
8 ResetEvent
9 LeaveCriticalSection
10 WaitForSingleObject WaitForSingleObject
11 not continue not continue
我有一種感覺,解鎖+睡眠是java原子 – basin
看到更新的問題 – basin
你不應該做ResetEvent,在這種情況下,你需要一個事件,自動重置,以避免競爭。 – nos