1

请参考以下java源代码:

static class SynchronizedList<E>
extends SynchronizedCollection<E>
implements List<E> {

final List<E> list;

public boolean equals(Object o) {
    synchronized (mutex) {return list.equals(o);}
}
public int hashCode() {
    synchronized (mutex) {return list.hashCode();}
}

public ListIterator<E> listIterator() {
    return list.listIterator(); //Must be manually synched by user
}

我的问题是为什么 listIterator() 不像 hashcode() 和 equals() 方法那样受到互斥锁的保护?为什么他们设计它需要用户进行外部同步?

4

3 回答 3

2

如果您建议:

public ListIterator<E> listIterator() {
    synchronized(mutex) { return list.listIterator(); }
}

那不会有太大帮助。

您将同步迭代器本身的创建,这可能有助于解决一些问题。但是您不会同步迭代器的使用。在您持有迭代器时仍然可以对列表进行更改 - 实现取决于 - 甚至可能导致它失败,因为列表可能暂时处于无效的内部状态。

于 2012-07-04T07:56:36.460 回答
2

ListIterator 的主要用途不是获取它,而是实际上迭代它以访问列表中的各个元素。这是一个有状态的操作,完全由客户端而不是类完成SynchronizedList。另一方面,方法equals()hashCode()完全在内部计算,SynchronizedList不需要客户端做太多期望获取返回值。正如 user1252434 指出的那样,同步获取迭代器的方法并没有多大帮助。

ListIterator 是一个典型的例子,它使用客户端锁定作为一种策略来确保在原始类无法提供同步时确保同步。

于 2012-07-04T08:35:11.160 回答
0

可能有两个可能的原因。

我们有三种不同的List接口实现。一个是Vector,另外两个是ArrayListLinkedList

一个原因是如果我们正在处理,Vectors那么绝对synchronization不需要,Vector因为它已经是线程安全的,但是如果我们正在使用ArrayListLinkedList那么我们需要同步这些列表

另一个原因是我们可以SynchronizedList 在应用程序中使用类,Single-Threaded如果他们会这样做listIterator(),那么即使在环境中Synchronized,这也是不必要的性能损失。thread-safetysingle-threaded

于 2012-07-04T07:25:27.140 回答