繁体   English   中英

Java:通过指针对象同步?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM