互斥

2012-11-26 109 views
1

有關示例,我有兩個節目喜歡這一個:
共享變量:互斥

boolean f0 = false; 
boolean f1 = false; 

程序0:

1. f0 = true; 
2. while(f1==true){} 
3. //Important section 
4. f0 = false; 

程序1:

a. f1 = true; 
b. while(f0==true){} 
c. //Important section 
d. f1 = false; 

我想問的是,有這樣的情況下,博th進程可以同時進入重要部分?你能給我一個具體代碼執行的例子嗎?
非常感謝。

+2

你應該說明你的意思是線程還是進程。 – assylias

+0

對不起,我的錯,我只是編輯它 – Xitrum

+2

你如何跨越「程序」共享變量?按程序,你的意思是過程?這很混亂。 – assylias

回答

2

總而言之,對於無數原因(緩存,指令重新排序等)而言。

+0

好摘要;-) – assylias

+0

你能給我一個真實的例子嗎? – Xitrum

+0

與提供的代碼和他們的行號 – Xitrum

0

是的,這可能發生!

可以保護該部分與

// this Object must be shared between both Threads. 
Object lock = new Object(); 

synronized(lock) { 

// .. here protected 

} 
0

如果這些是真正獨立的過程,那麼他們的操作是完全相互獨立的,因此答案是「是」。每個都有自己的所有變量的副本。

您是否想要詢問有關線索的問題?無論如何,除非你引入同步機制,否則答案是一樣的。

1

即使只處理0寫入F0,進程1可以是閱讀F0,而過程0被寫入到它,所以你可以最肯定的關鍵部分得到兩個過程。

你需要查找的關鍵字synronized學習如何安全地處理多個線程。

0

如果該代碼是在順序一致的方式執行,則答案爲沒有。沒有這樣的執行順序允許這兩個線程同時進入臨界區。

如果我們考慮Java領域,那麼是的,這是可能的。儘管他們共享一些數據,但您的線程不使用同步。在這種情況下,JVM不能保證他們會觀察到彼此的寫入。

但在任何情況下,這種「互斥」很容易出現死鎖。考慮這種執行:

f0 = true; 
f1 = true; 
--------------------- 
while (f0) {} 
while (f1) {}