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 来自另一个具有私人访问权限的 class,并且正在从 class.

内部访问它

是的,它们引用同一个对象,这是一个同步列表。

备注

我假设您知道使用同步列表只同步列表中的方法调用。

假设你有这样的事情:

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);
    }
}

can I synchronize over List_A and assume that access to List_a is synchronized?

没有。您无需再次同步 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

只是引用:

The iterators returned by this class's iterator and listIterator methods are fail-fast: if the vector is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future. The Enumerations returned by the elements method are not fail-fast.