黑马程序员技术交流社区

标题: 不知道下面的方法会不会出现线程同步的问题,请教一下 [打印本页]

作者: Lillian    时间: 2013-12-14 18:55
标题: 不知道下面的方法会不会出现线程同步的问题,请教一下
  1. public class Road {
  2.         private String name = null;
  3.         private List<String> vehicles = new ArrayList<String>();
  4.        
  5.         public Road(String name){
  6.                 this.name = name;
  7.                 System.out.println("Road"+this.name);
  8.                 ExecutorService singleThread = Executors.newSingleThreadExecutor();//返回一个只有一个线程的线程池
  9.                 singleThread.execute(new Runnable(){
  10.                         @Override
  11.                         public void run(){
  12.                                 for(int i = 0; i<1000; i++){
  13.                                         try {
  14.                                                 Thread.sleep((new Random().nextInt(10)+1)*1000);
  15.                                         } catch (InterruptedException e) {
  16.                                                 // TODO Auto-generated catch block
  17.                                                 e.printStackTrace();
  18.                                         }
  19.                                         synchronized(Road.this){
  20.                                         vehicles.add(Road.this.name + "_"+i);
  21.                                         //System.out.println("Add a vehicles:"+Road.this.name + "_"+i);
  22.                                         }
  23.                                 }
  24.                         }
  25.                 });
  26.                
  27.                 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  28.                 timer.scheduleAtFixedRate(
  29.                                 new Runnable(){
  30.                                         @Override
  31.                                         public void run(){
  32.                                                 if(vehicles.size()>0){
  33.                                                         boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
  34.                                                         if(lighted)
  35.                                                         {
  36.                                                                 System.out.println("CurrentThread"+Thread.currentThread());
  37.                                                                 System.out.println(vehicles.remove(0)+" is tralling..");
  38.                                                                 //这里与前面的 cehicles.add 不会产生同步的问题么?
  39.                                                         }
  40.                                                 }
  41.                                         }
  42.                                 },
  43.                                 1,
  44.                                 1,
  45.                                 TimeUnit.SECONDS);
  46.         }
  47. }
复制代码
这是张老师讲交通灯系统的Road部分,我有点困惑,这两个线程的run方法都在操作cehicles,会不会出现同步问题呢?编程应用中什么时候需要加synchronized呢? 请教一下。

作者: ysunday    时间: 2013-12-15 20:01
会的吧,记得张老师的视频是加了线程安全的synchronized关键字的,两个函数同时操作同一个资源的时候并且有两个或者多个线程可能同时调用这两个函数的时候就加synchronized,或者为了让一个线程执行这个函数的时候不让别的线程操作的时候就用synchronized。老师说开发很少用多线程的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2