深入理解Jvm里面讲到Vector类不是绝对线程安全,代码:
private static Vector<Integer> vector = new Vector<>();
public static void main(String args[]) throws Excption{
while(true){
for(int i=0; i<10; i++){
vector.add(i);
}
Thread removeT = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0; i<vector.size(); i++){
vector.remove(i);
}
}
});
Thread getT = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0; i<vector.size(); i++){
System.out.println(vector.get(i));
}
}
});
getT.start();
removeT.start();
while(Thread.activeCount()>20);
}
}
这段代码有下标越界的异常可能:代码中循环的时候有个下标i,同步会阻塞在remove和get,但是i已经定了,如果你恰好去查询的下标是最后一个,但是在你获取锁之前另一个线程给他删了就会异常。
如果理解有误,恳求指正,谢谢