2011-08-09 39 views
0

因此,Java支持對象級監視器。 所以當我們創建一個類的實例時,基本上我們正在創建不同的對象。現在,考慮一個場景,其中存在通過對象中的方法訪問對象的所有實例的共享數據。在java中如何使用監視器實現排除

請讓我知道在這種情況下關鍵字synchronized是如何實現線程安全的,因爲我擁有同一類的不同實例(對象)。

回答

2

在這種情況下,您將同步的對象您正在訪問的數據。

因此,如果您有100個Foo實例全部訪問一段數據,那麼這些數據只有一個引用。讓我們打電話給參考吧。然後,所有的Foos都會在進行同步時訪問Bar。

void changeBar(){ 
    synchronized(bar){ 
    //insert logic here 
    } 
} 
0

如果類的所有實例都訪問一個數據,你可能會使用一個static成員:

public class Foo { 
    private static Object shared; 

    public static void accessShared() { /* code */ } 
} 

在這種情況下,可以使static方法​​:

public class Foo { 
    private static Object shared; 

    public static synchronized void accessShared() { /* code */ } 
} 

這相當於代碼:

public class Foo { 
    private static Object shared; 

    public static void accessShared() { 
    synchronized (Foo.class) { /* code */ } 
    } 
} 

請記住,Foo.class本身就是一個對象,因此它有一個與之相關的監視器。