List线程不安全导致,你想要得到什么样的效果
解决方案 »
- java运行时会栈溢出这是为什么啊
- 程序出了点问题 各路好汉来看看
- p2p传输文件,哪位有研究的大侠能说说么,最好有实现!
- PreparedStatement ps = this.conn.prepareStatement("delete from 后台报错
- 关于ImageIcon()
- ArrayList是不是一能存不同数据类型的数组?
- 怎么用Socket实现一个HTTP服务器啊?
- 风中的菜鸟:)connectsql调用不起,怎么办?
- 如何把一個目錄下的所有以s為頭的文件讀出來呢?
- 请问高手们如何用JAVA对COM端口分别进行读和写操作?50分相送谢了!
- 请问我写的代码在哪里出了问题?求指导
- 用HttpURLConnection直接抓取这个地址,抓不下来
所谓的遍历时报错,是指先吧List装到一个Iterator中, 然后这边用Iterator.next遍历,那边用List.remove时出错。另外,我觉得LZ的遍历代码和Remove代码有很大的问题 -- 一般来说,我觉得这个遍历时希望各个线程能尽可能快的抓List的第1个img,如果抓到了就把它排除出去。不过即便是单线程,LZ的代码也是达不到这个目的的。
假设有List中有10个img,分别是000,001,002,...,009,通常,对于单线程来讲,希望它的输出结果就是000,001,002,...,009.
不过模拟一下就可以发现,第一个输出元素是item[0],即000不假,不过此后由于Remove语句,所以List变成了[001,002,003,...,009],然后i=1,结果下一个输出是002。
再接下去是004,006,008此外,线程的 判断数据存在+显示数据+删除数据 应当加上同步锁,否则当判断数据时有数据存在,当显示数据时系统发现该数据已经被其它线程删除了,自然会报IndexOutofRange错误。是我的话,线程代码可能会改成 public void run() {
List<String> list = image.getUrls();
for (; list.size()>0;) {
synchronized(this){
if (list.size() > 0) {
System.out.println(list.get(0) + "---" + Thread.currentThread().getName());
list.remove(0);
}
}
}
}
public class ImageDFile extends Thread {
public Image image;
public ImageDFile(Image image) {
this.image = image;
} @Override
public void run() {
synchronized (image) { // 在此处添加synchronized关键字即可
List<String> list = image.getUrls();
for (int i = 0; i < list.size(); i++) {
if (list.size() > 0) {
System.out.println(list.get(i) + "---" + Thread.currentThread().getName());
list.remove(i);
}
}
}
}
}原因:试想一下,并发问题,一般由于多线程访问共享资源(未加任何同步机制)引起的。多个线程同时,遍历同一个List,且删除元素,只要保证同一时刻只有一个线程对List进行操作即可。
2.你可以使用并发库中的线程安全的集合。Concurrentxxx
3.使用老的一个方法包一层,返回回来的就是安全的集合。有点忘记了。那个叫什么来Synchrinize打头的。