打字猴:1.700445494e+09
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 ]  [ 下一页 ]