如何使用java中的监视器实现排除

时间:2011-08-09 18:16:36

标签: java concurrency

因此Java支持对象级监视器。 因此,当我们创建一个类的实例时,基本上我们正在创建不同的对象。现在,考虑一种场景,其中对象的所有实例通过对象中的方法访问共享数据。

请让我知道关键字synchronized如何在这种情况下实现线程安全,因为我有相同类的不同实例(对象)。

2 个答案:

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