1.结论简述
- Stack的底层是基于Vector实现的,它继承自Vector
- push操作不是线程安全的,pop,push,peek,search是单操作多线程安全的。复合操作多线程不安全。
- 嗯,这个设计很迷。pop和peek,search之间非线程互斥的,所以peek,search上synchronized的意义是啥?我在pop的同时,能进行peek和search,出现IndexOutOfBoundsException是很容易的。
2.入栈 push
// push 多线程不安全,无法保证顺序,还容易出现脏数据
public E push(E item) {
// 调用的是Vector的addElement方法,新增对象
addElement(item);
return item;
}
3.出栈 pop
// 多线程只操作出栈是线程安全的,如果还同时进行push,那就是线程不安全的。
public synchronized E pop() {
E obj;
int len = size();
// 查找最后一个元素
obj = peek();
删除并返回
removeElementAt(len - 1);
return obj;
}
4.peek与search
// 调用的Vector的elementAt
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
// 调用的Vector的indexOf方法。这个会遍历Vector的底层数组
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
Vector和Stack,虽说线程安全,但是还是不要用了,因为这个只是针对单操作的,而且查询的时候还是串行访问,效率太低了。