因此,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
本身就是一个对象,因此它有一个与之相关的监视器。