2012-04-16 119 views
3

如果我有這樣的的Java syncrhonized靜態方法

public synchronized static foo() 
{ 

} 

編譯沒有問題的方法。

所以這導致了我兩個問題

  1. 什麼是syncrhonizing上?班,還是別的什麼?
  2. 你可以同步一個類,是否鎖定該類的所有對象?

例如,你可以做MyClass

synchronized(Foo) // where Foo is a class 
{ 
} 
+0

是的,它正在'Class'對象上同步。我不確定我是否正確理解你的第二個問題,你能否重申它? – Jeffrey 2012-04-16 01:32:57

+0

確定我現在要做 – rubixibuc 2012-04-16 01:33:54

+0

1)它正在'Class'對象上同步。 2)它應該是'synchronized(Foo.class)' – fireshadow52 2012-04-16 01:34:11

回答

3

同步靜態方法在本質上是一樣的synchronized(MyClass.class)塊。你的第二個例子應該改寫爲

synchronized(Foo.class) { 
} 

是正確的。

如果您希望對您的課程同步保持警惕,那麼您應該對您課堂以外不可見的私人靜態對象進行同步。這可以防止惡意代碼通過在其類對象上執行​​來阻止您的靜態方法,從而阻止合法的方法。

至於「鎖定所有對象」雲,非靜態方法標記​​不會通過靜態​​方法的執行被鎖定,因爲經常​​方法對對象的實例鎖定,而不是它的類。

+0

它們在語法上是否相同,如果我不使用Foo.class會導致編譯器錯誤,編譯器是否知道我的意思? – rubixibuc 2012-04-16 01:35:35

+0

@rubixibuc編譯器需要一個表達式,其計算結果爲在'synchronized'塊的括號內提供的對象;由於'Foo'不是一個表達式,它的值是一個對象,所以你應該得到一個編譯錯誤。 – dasblinkenlight 2012-04-16 01:38:35

3

是的,它正在同步Class對象。您可以同步任何Class對象。您可以使用其文字(Foo.class),也可以使用Foo實例的getClass()方法。

有關同步的更多的信息(在該線索的第二頁包含關於鎖定同步方法使用該信息):http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

+0

Doe Foo本身總是隱式引用類對象? – rubixibuc 2012-04-16 01:39:20

+0

@rubixibuc不,它指的是* type *'Foo',而不是'Class'。 – Jeffrey 2012-04-16 01:39:58

+0

是否在同步塊的情況下提及? – rubixibuc 2012-04-16 01:40:27

2
  1. 據同步class對象上,例如MyClass.class
  2. 不,它不鎖定類的對象
0

靜態方法使用該類作爲鎖定對象。

在Java語言規範的相關部分是8.4.3.6, 'synchronized Methods'

甲同步方法獲取監視器它執行(§17.1)之前。對於類(靜態)方法,使用與方法類的Class對象關聯的監視器。對於實例方法,使用與此相關的監視器(爲其調用方法的對象)。