线程安全 锁住集合

J2EE 码拜 8年前 (2016-03-14) 1023次浏览
线程安全 锁住集合
private static List <Integer> list= new ArrayList<>();
public static void main(String[] args) {
for(int i=0;i<10;i++){
list.add(i);
}
Thread t1= new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (list) {
for (int i = 0; i < list.size(); i++) {
System.out.println(i);
Integer remove = list.remove(i);
System.err.println(“删除==”+remove);
}
}
}
});
Thread t2= new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (list) {
for (int i = 0; i < list.size(); i++) {
// Thread.currentThread();
System.err.println(“size=”+list.size());
System.err.println(“输出”+ list.get(i));
}
}
}
});
t1.start();
t2.start();
}
///////////////////////////////////////////////花丽丽的分割线//////////////////////
看书看到个线程安全的知识点 原素材是用的vector 怎么也得不到理想答案 素 换成了list测试的 结果还是不懂 ?
已经加了 按理说 或输出1-9和删除1-9 或光输出删除1-9
结果却不是
console>>>>>>
0
删除==0
1
删除==2
2
删除==4
3
删除==6
4
删除==8
size=5
输出1
size=5
输出3
size=5
输出5
size=5
输出7
size=5
输出9
解决方案

10

Integer remove = list.remove(i);
问题出在这里,list里的元素删掉了,这个for循环的次数也就不是原来的大小了

5

循环10次,删掉了5个,剩下的也就只有5个了

5

你把remove那个操作去掉,就是你想要的效果

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明线程安全 锁住集合
喜欢 (0)
[1034331897@qq.com]
分享 (0)