我知道他们都有线程安全的方法。我想知道它们是如何线程安全的?实施是什么?这是所有访谈中的常见问题。
答案 0 :(得分:1)
在Vector中查看Hashtable和OpenJDK的代码,您会注意到大多数公共方法都是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。它只是这样说的方式。)