因此,Java支持對象級監視器。 所以當我們創建一個類的實例時,基本上我們正在創建不同的對象。現在,考慮一個場景,其中存在通過對象中的方法訪問對象的所有實例的共享數據。在java中如何使用監視器實現排除
請讓我知道在這種情況下關鍵字synchronized是如何實現線程安全的,因爲我擁有同一類的不同實例(對象)。
因此,Java支持對象級監視器。 所以當我們創建一個類的實例時,基本上我們正在創建不同的對象。現在,考慮一個場景,其中存在通過對象中的方法訪問對象的所有實例的共享數據。在java中如何使用監視器實現排除
請讓我知道在這種情況下關鍵字synchronized是如何實現線程安全的,因爲我擁有同一類的不同實例(對象)。
在這種情況下,您將同步爲的對象您正在訪問的數據。
因此,如果您有100個Foo實例全部訪問一段數據,那麼這些數據只有一個引用。讓我們打電話給參考吧。然後,所有的Foos都會在進行同步時訪問Bar。
void changeBar(){
synchronized(bar){
//insert logic here
}
}
如果類的所有實例都訪問一個數據,你可能會使用一個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
本身就是一個對象,因此它有一個與之相關的監視器。