A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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呢? 请教一下。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

1 个回复

倒序浏览
会的吧,记得张老师的视频是加了线程安全的synchronized关键字的,两个函数同时操作同一个资源的时候并且有两个或者多个线程可能同时调用这两个函数的时候就加synchronized,或者为了让一个线程执行这个函数的时候不让别的线程操作的时候就用synchronized。老师说开发很少用多线程的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马