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.
假设我有 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.