如果我有這樣的的Java syncrhonized靜態方法
public synchronized static foo()
{
}
編譯沒有問題的方法。
所以這導致了我兩個問題
- 什麼是syncrhonizing上?班,還是別的什麼?
- 你可以同步一個類,是否鎖定該類的所有對象?
例如,你可以做MyClass
這
synchronized(Foo) // where Foo is a class
{
}
如果我有這樣的的Java syncrhonized靜態方法
public synchronized static foo()
{
}
編譯沒有問題的方法。
所以這導致了我兩個問題
例如,你可以做MyClass
這
synchronized(Foo) // where Foo is a class
{
}
同步靜態方法在本質上是一樣的synchronized(MyClass.class)
塊。你的第二個例子應該改寫爲
synchronized(Foo.class) {
}
是正確的。
如果您希望對您的課程同步保持警惕,那麼您應該對您課堂以外不可見的私人靜態對象進行同步。這可以防止惡意代碼通過在其類對象上執行來阻止您的靜態方法,從而阻止合法的方法。
至於「鎖定所有對象」雲,非靜態方法標記不會通過靜態方法的執行被鎖定,因爲經常方法對對象的實例鎖定,而不是它的類。
它們在語法上是否相同,如果我不使用Foo.class會導致編譯器錯誤,編譯器是否知道我的意思? – rubixibuc 2012-04-16 01:35:35
@rubixibuc編譯器需要一個表達式,其計算結果爲在'synchronized'塊的括號內提供的對象;由於'Foo'不是一個表達式,它的值是一個對象,所以你應該得到一個編譯錯誤。 – dasblinkenlight 2012-04-16 01:38:35
是的,它正在同步Class
對象。您可以同步任何Class
對象。您可以使用其文字(Foo.class
),也可以使用Foo
實例的getClass()
方法。
有關同步的更多的信息(在該線索的第二頁包含關於鎖定同步方法使用該信息):http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
class
對象上,例如MyClass.class
靜態方法使用該類作爲鎖定對象。
在Java語言規範的相關部分是8.4.3.6, 'synchronized Methods':
甲同步方法獲取監視器它執行(§17.1)之前。對於類(靜態)方法,使用與方法類的Class對象關聯的監視器。對於實例方法,使用與此相關的監視器(爲其調用方法的對象)。
是的,它正在'Class'對象上同步。我不確定我是否正確理解你的第二個問題,你能否重申它? – Jeffrey 2012-04-16 01:32:57
確定我現在要做 – rubixibuc 2012-04-16 01:33:54
1)它正在'Class'對象上同步。 2)它應該是'synchronized(Foo.class)' – fireshadow52 2012-04-16 01:34:11