[英]Java: synchronized over pointers to objects?
假设我有list_a
,我需要同步访问。 现在,如果我定义一个指向此对象list_A
的指针
List<...> list_a=Collections.synchronizedList(new ArrayList<JmDNS>());
List<...> list_A=list_a;
我可以通过List_A
同步并假设对List_a
访问是同步的吗? 这是因为list_a
来自具有私有访问权限的不同类,并且正在该类中访问它。
是的,它们引用同一对象,即同步列表。
注意
我假设您知道通过使用同步列表仅在列表上同步方法调用。
假设你有这样的东西:
if (list_A.size() > 0) {
Object element = list_A.remove(0);
}
单独使用同步列表不会使这成为线程安全的操作序列,因为两个线程可以同时将if
条件评估为true
,然后两者都可以尝试从列表中删除第一个元素。
你可以这样解决:
synchronized(list_A) {
if (list_A.size() > 0) {
Object element = list_A.remove(0);
}
}
我可以通过List_A同步并假设对List_a的访问是同步的吗?
不需要。您无需再次同步List_A
。 因为List_A
已经指向同步的list_a
。
List<...> list_A=list_a;
仅此一行就意味着,您不是在创建任何新对象,而只是引用现有对象。
您无需再次同步list_A,因为引用list_A和list_a指向同步的同一列表。
但是在迭代时需要在列表周围进行同步。 像这样的同步集合的常见用例是在多个线程中添加到列表中,但仅在所有任务完成时才在末尾迭代它。
如果在完成所有更新线程之后进行迭代,那么不要担心同步时间。
为什么不使用java.util.Vector?
http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html
只是引用:
这个类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对向量进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException。 因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒着任意的,非确定性行为的风险。 elements方法返回的枚举不是快速失败的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.