因此Java支持对象级监视器。 因此,当我们创建一个类的实例时,基本上我们正在创建不同的对象。现在,考虑一种场景,其中对象的所有实例通过对象中的方法访问共享数据。
请让我知道关键字synchronized如何在这种情况下实现线程安全,因为我有相同类的不同实例(对象)。
答案 0 :(得分:2)
在这种情况下,您将同步 您正在访问的数据的对象。
因此,如果您有100个Foo实例都访问一段数据,那么该数据只有一个引用。让我们称之为参考栏。然后你的所有Foos都会在同步时访问Bar。
void changeBar(){
synchronized(bar){
//insert logic here
}
}
答案 1 :(得分:0)
如果班级的所有实例都在访问一段数据,那么您可能正在使用static
成员:
public class Foo {
private static Object shared;
public static void accessShared() { /* code */ }
}
在这种情况下,您可以制作static
方法synchronized
:
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
本身就是一个对象,因此有一个与之关联的监视器。