1700445494
while(true){
1700445495
1700445496
tickets.add(“车票”+new Random().nextInt());
1700445497
1700445498
}
1700445499
1700445500
};
1700445501
1700445502
};
1700445503
1700445504
//售票
1700445505
1700445506
Thread saleThread=new Thread(){
1700445507
1700445508
public void run(){
1700445509
1700445510
for(String ticket:tickets){
1700445511
1700445512
tickets.remove(ticket);
1700445513
1700445514
}
1700445515
1700445516
};
1700445517
1700445518
};
1700445519
1700445520
//启动退票线程
1700445521
1700445522
returnThread.start();
1700445523
1700445524
//启动售票线程
1700445525
1700445526
saleThread.start();
1700445527
1700445528
}
1700445529
1700445530
模拟火车站售票程序,先初始化一堆火车票,然后开始出售,同时也有退票产生,这段程序有没有问题?可能会有读者看出了问题,ArrayList是线程不安全的,两个线程访问同一个ArrayList数组肯定会有问题。
1700445531
1700445532
没错,确定有问题,运行结果如下:
1700445533
1700445534
Exception in thread”Thread-1”java.util.ConcurrentModifcationException
1700445535
1700445536
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
1700445537
1700445538
at java.util.AbstractList$Itr.next(AbstractList.java:343)
1700445539
1700445540
at Client$2.run(Client.java:28)
1700445541
1700445542
运气好的话,该异常马上就会报出。也许有人会说这是一个典型错误,只须把ArrayList替换成Vector即可解决问题,真的是这样吗?我们把ArrayList替换成Vector后,结果照旧,仍然抛出相同的异常,Vector已经是线程安全的,为什么还报这个错误呢?
1700445543
[
上一页 ]
[ :1.700445494e+09 ]
[
下一页 ]