2017-05-25 42 views
0

想象一下,一個名爲foo()的靜態方法需要花費大量的時間來執行。這個方法在一個靜態類中。從不同線程訪問靜態方法

public static class FooClass 
{ 
    public static void Foo() 
    { 
     Thread.Sleep(120000); // 2 minutes. 
    } 
} 

我有兩個同時調用此方法的同一類的實例。由於FooClass是靜態的,這是否意味着實例2必須等待的Instance1執行完foo()(假設的Instance1進入foo()第一)?

據我所知,靜態類包含一個在應用程序池中共享的實例。

+0

你在混合靜態類和靜態方法。另外,你的代碼不會像靜態類中的非靜態方法那樣編譯。 – Euphoric

+0

@Euphoric,請你詳細說明爲什麼我混合靜態類和靜態方法? –

+0

@ kidra.pazzo - 德米特里爲你修好了它,但你有'public void Foo()'而不是'public static void Foo()',它不會編譯爲'FooClass'被標記爲靜態。 – Igor

回答

2

不,他們不必等待。兩個線程都可以同時輸入Foo,並且在上面的代碼中,每個線程都會休眠2分鐘。

使一個線程等待另一個線程的唯一方法是添加一個同步/鎖定機制,如lock關鍵字或tyes MutexMonitor(僅舉幾例)。

+0

是否因爲方法是可重入的? –

+0

@ kidra.pazzo - 不會。同樣的情況是一個實例方法,它們也可以被多個線程同時訪問。線程和實例/靜態成員彼此沒有直接關係。 – Igor

0

相同的方法可以在'同一時間'在兩個線程上運行,所以兩個線程都會休眠。如果您需要確保每次調用的方法都是原子的(如果它正在編輯數據),則需要使用鎖定。

相關問題