您当前的位置: 首页 > 

庄小焱

暂无认证

  • 2浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JDK源码——Vector类

庄小焱 发布时间:2020-08-19 13:45:01 ,浏览量:2

同步容器(如Vector)并不是所有操作都线程安全!
import java.util.Vector;

/**
 * Copyright (C), 2018-2020
 * FileName: Thread_vetcor
 * Author:   xjl
 * Date:     2020/8/19 12:06
 * Description: Vector线程安全
 */

public class Thread_vetcor {

    private static Vector vector=new Vector();

    public static void main(String[] args) {
        while(true){
            for(int i=0;i elementCount) {
            ensureCapacityHelper(newSize);
        } else {
            for (int i = newSize ; i < elementCount ; i++) {
                elementData[i] = null;
            }
        }
        elementCount = newSize;
    }

public synchronized int capacity() {
        return elementData.length;
    }

 public synchronized int size() {
        return elementCount;
    }

解释:Vector里一些写删操作的方法都是用synchronized实现同步。尽管vector中的contains()方法和 add()方法都是同步的。但是组合应用时还是存在现场安全问题。

假如有两个线程同时进入put()方法,传递的参数都是一样的,例如 put("123")。当线程1执行if (!vector.contains(element)) 后还没有执行vector.add(element); 时,线程2进来了,此时vector.contains(element))还是返回false,这样的结果会导致两个123都加入到vector。所以是线程不安全的。

例子中 removeThread线程先调用了vector.size()方法获得vector的大小,接着调用vector.remove(i)移除第i个元素;而printThread线程也先调用vector.size()方法获得vector的大小,接着调用vector.get()获得第i个元素。

假设此时vector大小为5,此时printThread线程执行到 i=4 ,进入for循环但在 System.out.println(vector.get(i));之前 printThread线程的CPU时间片已到,线程printThread转入就绪状态; 此时removeThread线程获得CPU开始执行,把vector的5个元素全删除了,这是removeThreadCPU时间片已到; 接着printThread获得CPU进行执行,由于之前printThread中的i==4,于是调用vector.get(4)获取元素,此时由于vector中的元素已被removeThread线程全部删除,因此报错。

总的来说,vector保证了其同步方法不能被两个及两个以上线程同时访问,但是我们自己的操作会使得即使使用了Vector线程也不安全,如果不大清楚,最好自己加上 synchronized进行同步吧。

关注
打赏
1657692713
查看更多评论
立即登录/注册

微信扫码登录

0.0392s