Java同步引用

时间:2011-04-29 03:59:14

标签: java multithreading synchronized

我有一个A和B级。

public class A() { 
    private static List<int> list = new ArrayList<int>(); 
    public static List<int> getList() {
        return list;
    }
}

public class B() { 
    public void foo() {
        synchronized(A.getList()) {
            // DO Stuff
        }
    }
}

在我同步的B级。这是在A的列表上,还是在B对A列表的引用上同步。我认为这是后者,但可以使用一些帮助。

如果是这样,那么我该如何完成类似的实际工作呢?

谢谢!

2 个答案:

答案 0 :(得分:6)

它在A的列表上同步。 B对A列表的引用是什么意思?如果您使用A.getList()进入A使用列表或B,则它们都引用相同的对象。当你在它上进行同步时,你将阻止其他线程在同一个对象上进行同步,无论它从哪里被引用。

答案 1 :(得分:1)

OP随后发表了这条评论:

  

我看到的行为是奇怪的是,如果我从A中锁定,我实际上可以在B中同时锁定它。这几乎意味着同步没有效果。这就是为什么我推测可能锁定引用不起作用。

问题中的代码不会发生这种情况。

但如果setList中有A方法更新list变量,则可能会发生这种情况。然后,您可能会遇到两个线程锁定不同对象的情况。

另一种可能性是你实际上只有一个线程锁定同一个对象两次。这是正常的行为。 Java原始互斥体是可重入的;即它们只能防止两个不同的线程同时持有相同的互斥锁。