Stack源码浅析

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,虽说线程安全,但是还是不要用了,因为这个只是针对单操作的,而且查询的时候还是串行访问,效率太低了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值