2016-02-19 18 views
2

我有兩個同步函數的類。這意味着如果thread-0執行proc1()thread-1想要做proc1()相同,它將等待thread-0proc1()完成。請糾正我,如果我錯了。兩個函數中的synchronized指令是否意味着它們都可用於一個線程?

但是如果thread-0執行proc1()thread-1想要執行proc2()?如果thread-1需要等待proc1()將由thread-0完成?

換句話說 - 同步函數在類對象級別或只是函數級別同步?

public class MyClass 
{ 
public synchronized void proc1() 
{ 
... 
} 
public synchronized void proc2() 
{ 
... 
} 

} 
+0

這是您可以自己嘗試的例子之一。 –

+0

不知道我可以,因爲你永遠不知道什麼時候系統會決定切換到另一個線程。 – vico

+0

在這種情況下,你當然可以。如果你想用兩個線程進行測試,並在每種方法中進行睡眠,你會注意到兩個線程都進入睡眠狀態,或者一個線程進入睡眠狀態。 –

回答

3

你需要了解​​最重要的事情是,一個synchronized方法或synchronized塊總是在一些對象同步,沒有任何兩個線程都不會被允許同時在同一個對象上進行同步。

在同步塊的情況下,明確提供同步對象。在這個例子中,它的任何對象由可變foo引用:

synchronized(foo) { 
    ... 
} 

在一個同步實例方法的情況下,同步對象是this(即,對象在其上的方法被調用)。在這種情況下,MyClass一個實例:

class MyClass 
    synchronized void proc1() { 
     ... 
    } 
} 

而且,如果它是一個同步static方法,該同步對象是類的對象。在這種情況下,它將是MyClass.class

class MyClass { 
    static synchronized void proc2() { 
     ... 
    } 
} 
+2

所以這意味着proc1()和proc2()在同一個「this」上同步。這個menas不同的線程將不被允許運行相同對象的proc1()和proc2()?所以答案是「在對象層面」 – vico

+0

@vico - 正確!另外值得注意的是,如果'proc1'稱爲'proc2',你可以在'this'上鎖定,這樣就可以使用'proc2'。 – OldCurmudgeon

0

​​在物體(例如)電平被施加,並且一個線程訪問​​方法將鎖定對象。所以如果你正在處理同一個對象實例,那麼thread-0必須在thread-1可以訪問它的任何方法之前釋放該鎖。 thread-1將處於阻塞狀態,直到它可以獲取鎖定。

據進一步解釋這裏:Do two synchronized methods execute simultaneously

相關問題