2012-08-09 63 views

回答

0

在Java中,您可以使用​​結構在任何對象引用上創建內部鎖,是的。閱讀相關Java Tutorial

的使用​​與此立即例子是Class對象,這是how static synchronized methods work上同步時。實際上,有很多有效的用途。您可能希望避免使用synchronized (this)來支持內部實現鎖定,否則您會設置內部使用鎖定的限制,您不知道哪些其他代碼可能會違反。

但是,您應該知道,您經常可以用ReentrantLock代替​​。您可以在my post here瞭解更多。

+0

固有...總是忘記這個詞。 – 2012-08-09 03:06:19

0

是的,它可以做到。

同步塊將使用該對象作爲鎖,而不是整個類。使用synchronized(this){}的人對整個對象設置排它鎖,這可能是您想要的。然而,你可能有一個像persist的東西,這是唯一需要同步的東西。同步(persister){},將提供一個不太精細的方式來做到這一點。

0
public class SyncTest{ 
    private Object obj = new Object(); 

    public void func1() { 
     synchronized(obj) { 
      obj.something(); 
     } 
} 
+1

只要確保您使用的是足夠複雜的Object。試圖在像布爾型這樣的類型上進行同步不會做你認爲會因爲它是如何在內部處理的。 – Thomas 2012-08-09 03:08:35

+1

並確保最終的鎖定。 – assylias 2012-08-09 03:09:18

1

是的聲明是真實的。

有幾個原因讓人不想使用內部監視器(synchronized(this)) - 其中一個原因是它可以創建活躍性問題 - 在下面的代碼中,B使用A的一個實例作爲鎖,也許來控制對該變量的訪問。如果另一個線程使用A的相同實例並嘗試運行a.methodA(),它將被阻止,直到methodB()結束。

因此,使用內置監視器會暴露同步策略,並可能導致細微的錯誤和性能問題。

public class A { 

    public synchronized void methodA() {} 

} 

public class B { 
    A a = new A(); 
    public void methodB() { 
     synchronized(a) { 
      // do something a little long 
     } 
    } 
    public A getA() {return a;} 
} 

如果A使用了內部監視器,則該問題將不可能實現。

public class A { 
    private final Object lock = new Object(); 

    public void methodA() { 
     synchronized(lock) {} 
    } 

} 

的另一種情況,其中使用ad hoc監視器有意義是當一個類包含2(或更多)不相關的對象,即兩者都需要以同步的方式進行訪問。因爲現在可以同時訪問2個對象,所以使用2個監視器而不是1個監視器可以減少爭用。