问题 堆栈扩展矢量


如果堆栈扩展向量,那意味着堆栈是同步的吗?

Vector Java docs的注释

与新的集合实现不同,Vector是同步的。


2800
2017-12-20 15:09


起源



答案:


是的,它是同步的,但根据 的Javadoc 你应该更喜欢 Deque 代替 Stack

来自 Stack 的Javadoc

一套更完整,更一致的LIFO堆栈操作   由Deque接口及其实现提供,应该   优先使用这个类。例如:

Deque<Integer> stack = new ArrayDeque<Integer>();


12
2017-12-20 15:12



如有疑问 看看代码 (*仅限openjdk;)) - soulcheck
为什么不使用LinkedList? ArrayDeque是Deque的实现,但Vector是List的实现 - ZhiXingZhe - WangYuQi


答案:


是的,它是同步的,但根据 的Javadoc 你应该更喜欢 Deque 代替 Stack

来自 Stack 的Javadoc

一套更完整,更一致的LIFO堆栈操作   由Deque接口及其实现提供,应该   优先使用这个类。例如:

Deque<Integer> stack = new ArrayDeque<Integer>();


12
2017-12-20 15:12



如有疑问 看看代码 (*仅限openjdk;)) - soulcheck
为什么不使用LinkedList? ArrayDeque是Deque的实现,但Vector是List的实现 - ZhiXingZhe - WangYuQi


是的,从Vector继承的方法在Stack中保持同步。自己的堆栈方法peek,pop,search在Stack中同步。 Stack.push和Stack.empty方法不同步,但是

public boolean empty() {
    return size() == 0;
}

public E push(E item) {
    addElement(item);
    return item;
}

这两种方法都调用Vector的同步方法,因此Stack.empty和Stack.push是线程安全的。


3
2017-12-20 15:16



+1。我认为这是正确的。我不认为扩展向量使自己的Stack同步。这是方法的定义方式。 - kosa
对,它不是一个类可以同步但它的方法 - Evgeniy Dorofeev