我知道他们都有线程安全的方法。我想知道它们是如何线程安全的?执行情况是什么?这是所有面试中常见的问题。
6 回答
查看OpenJDK中Vector和Hashtable的代码,您会注意到大多数公共方法都是,这是使两个集合的方法线程安全的实现细节。另请注意,对这些集合的其他操作(例如迭代)需要外部同步以实现线程安全。synchronized
他们不是。他们所有的方法都是同步的。这不是一回事。对它们的迭代不是也不能是线程安全的,除非包含迭代的块是线程安全的,例如同步的。所以调用者仍然有责任提供线程安全。这就是集合框架中的新类默认没有同步方法的原因。
这些类是有条件的线程安全的,使用它们不是一种好的风格。更好的选择是使用真正线程安全并提供良好性能的 java.util.concurrent.* 类(例如 ConcurrentHashMap、CopyOnWriteArrayList 等)
例如,ConcurrentHashMap 比同步的 HashMap 扩展性更好:http ://www.javamex.com/tutorials/concurrenthashmap_scalability.shtml
术语表明类中的方法是线程安全的,即同步的!(一个类本身不能是线程安全的。它只是这么说的方式。)
我的 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++;
}
所有重要的方法都以这种方式同步,就在方法签名中。
但是请注意,这不是强制性的。合同只说你必须让它线程安全,它没有具体说明如何。
这两个类的问题在于,它们通过提供同步方法给人以线程安全的印象,但它们的内部状态可以通过它们提供给您访问的迭代器来修改。
这种同步只会在所有同步方法中执行线程独占权,因为它们共享相同的同步锁。