打字猴:1.700445555e+09
1700445555
1700445556 tickets.add(“火车票”+i);
1700445557
1700445558 }
1700445559
1700445560 //10个窗口售票
1700445561
1700445562 for(int i=0;i<10;i++){
1700445563
1700445564 new Thread(){
1700445565
1700445566 public void run(){
1700445567
1700445568 while(true){
1700445569
1700445570 System.out.println(Thread.currentThread().getId()
1700445571
1700445572 +”—”+tickets.remove(0));
1700445573
1700445574 }
1700445575
1700445576 };
1700445577
1700445578 }.start();
1700445579
1700445580 }
1700445581
1700445582 }
1700445583
1700445584 还是火车站售票程序,有10个窗口在卖火车票,程序打印出窗口号(也就是线程号)和车票编号,很快我们就会看到这样的输出:
1700445585
1700445586 13—火车票96531
1700445587
1700445588 10—火车票96531
1700445589
1700445590 9—火车票96530
1700445591
1700445592 16—火车票96530
1700445593
1700445594 注意看,上面有两个线程在卖同一张火车票,这才是线程不同步的问题,此时把ArrayList修改为Vector即可解决问题,因为Vector的每个方法前都加上了synchronized关键字,同时只会允许一个线程进入该方法,确保了程序的可靠性。
1700445595
1700445596 虽然在系统开发中我们一再说明,除非必要,否则不要使用synchronized,这是从性能的角度考虑的,但是一旦涉及多线程时(注意这里说的是真正的多线程,不是并发修改的问题,比如一个线程增加,一个线程删除,这不属于多线程的范畴),Vector会是最佳选择,当然自己在程序中加synchronized也是可行的方法。
1700445597
1700445598 HashMap的线程安全类HashTable与此相同,不再赘述。
1700445599
1700445600 注意 多线程环境下考虑使用Vector或HashTable。
1700445601
1700445602
1700445603
1700445604
[ 上一页 ]  [ :1.700445555e+09 ]  [ 下一页 ]