3

我知道他们都有线程安全的方法。我想知道它们是如何线程安全的?执行情况是什么?这是所有面试中常见的问题。

4

6 回答 6

1

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

于 2012-04-04T02:47:30.517 回答
1

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

于 2012-04-04T02:47:36.297 回答
0

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

例如,ConcurrentHashMap 比同步的 HashMap 扩展性更好:http ://www.javamex.com/tutorials/concurrenthashmap_scalability.shtml

于 2012-04-04T03:27:50.550 回答
0

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

于 2014-04-21T12:01:55.920 回答
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++;
}

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

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

于 2012-04-04T02:47:45.543 回答
0

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

这种同步只会在所有同步方法中执行线程独占权,因为它们共享相同的同步锁。

于 2012-04-04T04:24:47.410 回答