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