Vector和Hashtable如何在集合中是线程安全的?

时间:2012-04-04 02:43:49

标签: java

我知道他们都有线程安全的方法。我想知道它们是如何线程安全的?实施是什么?这是所有访谈中的常见问题。

6 个答案:

答案 0 :(得分:1)

Vector中查看HashtableOpenJDK的代码,您会注意到大多数公共方法都是synchronized,这是实现细节,使两个集合的方法成为线程安全的。另请注意,这些集合上的其他操作(例如,迭代)需要外部同步才能保证线程安全。

答案 1 :(得分:1)

他们不是。他们所有的方法都是同步的。这不是一回事。对它们的迭代不是也不能是线程安全的,除非包含迭代的块是线程安全的,例如,同步。因此呼叫者仍有责任提供线程安全性。这就是集合框架中的新类默认没有同步方法的原因。

答案 2 :(得分:0)

我的Sun / Oracle JDK版本附带的Vector类,有6个,使用同步方法,如此

public synchronized void insertElementAt(E obj, int index) {
modCount++;
if (index > elementCount) {
    throw new ArrayIndexOutOfBoundsException(index
                         + " > " + elementCount);
}
ensureCapacityHelper(elementCount + 1);
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
elementData[index] = obj;
elementCount++;
}

所有重要的方法都以这种方式同步,就在方法签名中。

但请注意,这不是强制性的。合同只说你必须使它线程安全,它没有指明如何。

答案 3 :(得分:0)

这些类是有条件的线程安全的,使用它们不是一个好的风格。更好的选择是使用java.util.concurrent。*类(例如ConcurrentHashMap,CopyOnWriteArrayList等),它们是真正的线程安全并提供良好的性能

E.g。 ConcurrentHashMap比同步HashMap更好地扩展:http://www.javamex.com/tutorials/concurrenthashmap_scalability.shtml

答案 4 :(得分:0)

这两个类的问题在于它们通过提供同步方法给出了线程安全的印象,但它们的内部状态可由它们为您提供访问的迭代器修改。

此处的同步仅在所有同步方法中执行时获取线程独占性,因为它们共享同一个同步锁。

答案 5 :(得分:0)

这个术语表明类中的方法是线程安全的,即同步的! (一个类本身不能成为Threadsafe。它只是这样说的方式。)