2013-04-18 60 views
1

我有4個線程同時運行,試圖訪問以下四種不同的同一類的方法。 我想知道線程執行的順序。多線程訪問同一類

public void method1(); 
public static void method2(); 
public synchronized void method3(); 
public static synchronized method4(); 

方法1是由T1稱爲方法2 由T2稱爲方法3 由T3稱爲 方法4是由T4

所有上述方法在相同的類中調用。 我完全困惑哪些訂單線程將運行。 請求您的幫助。

回答

3

線程將半並行運行。如果你不同步它們,它們可以以任意順序運行。

您在示例中給出的同步方法不會相互影響。前兩個根本沒有同步,第三個同步在對象實例上,第四個同步在。所以,這四個線程可以按任何特定順序運行。

0

有沒有辦法知道這一點。所有線程都基於系統中CPU /內核的數量以及系統的優先級和整個系統的負載而同時運行。因此,主要是哪個線程有機會執行一些代碼是偶然事件。

線程調度器的表面上任意性質也是使調試競爭條件,活鎖和死鎖對開發人員非常「有趣」的原因。當您不使用(足夠)同步機制時,無法可靠地預測OS如何執行您的代碼。

0

的順序,該線程將執行將取決於多種因素,所以真正的問題是什麼樣的順序,你希望他們執行的,以及在什麼條件下會順序更改?

一旦你解決了這個問題,你可以強制一個線程等待或阻塞另一個線程,直到它完成。這是大多數語言/環境中最常用的線程編程方法。

+0

如果你不打算提供答案,然後使用評論來獲得更多的細節。 – James

+0

@James請注意,所有其他*答案*都沒有說明順序,因爲沒有定義。併發的要點是讓事情同時發生,而不是之前或之後。 –

1

預測線索訂單是完全不可能的。這是JVM的全部責任,而不是程序員,並且沒有基本的法律。

同步對此沒有任何幫助。它只是允許確保原子性和內存屏障。

由於這個事實,最爲人所知的「問題」可能是:Race Condition控制程序員關於線程的決定很敏感。