我有一个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列表的引用上同步。我认为这是后者,但可以使用一些帮助。
如果是这样,那么我该如何完成类似的实际工作呢?
谢谢!
答案 0 :(得分:6)
它在A的列表上同步。 B对A列表的引用是什么意思?如果您使用A.getList()进入A使用列表或B,则它们都引用相同的对象。当你在它上进行同步时,你将阻止其他线程在同一个对象上进行同步,无论它从哪里被引用。
答案 1 :(得分:1)
OP随后发表了这条评论:
我看到的行为是奇怪的是,如果我从A中锁定,我实际上可以在B中同时锁定它。这几乎意味着同步没有效果。这就是为什么我推测可能锁定引用不起作用。
问题中的代码不会发生这种情况。
但如果setList
中有A
方法更新list
变量,则可能会发生这种情况。然后,您可能会遇到两个线程锁定不同对象的情况。
另一种可能性是你实际上只有一个线程锁定同一个对象两次。这是正常的行为。 Java原始互斥体是可重入的;即它们只能防止两个不同的线程同时持有相同的互斥锁。