分配列表在Java中是线程安全的?

时间:2019-02-25 07:45:27

标签: java multithreading thread-safety

我搜索发现分配对象是线程安全的(long,double类型除外) 我想确认以下代码是线程安全的。

class SharedAnyClass {
 public static volatile obj = new ArrayList();
}

class Writer {
  // thread 1
  void run() {
     List temp = new ArrayList();
     temp.add(xx);
     SharedAnyClass.obj= temp;  // assign object in thread 1
  }
}

class Reader {
  void run() {
    List temp = SharedAnyClass.obj;
    for ( int i=0;i<temp.length(); i++ ) {
       temp.get(xx)... // read object in thread 2
    }      
 }
}

据我所知, 当读者正在for循环中读取共享列表时, 编写器线程可以在线程安全中分配共享列表。 在这种情况下,Reader线程仍可以使用旧的共享List对象在for循环中读取共享List。 当Reader线程稍后尝试执行run()函数时,它将读取新的共享List对象。 这样对吗?

1 个答案:

答案 0 :(得分:0)

此代码是错误的。线

List temp = SharedAnyClass.obj;
     

可以在分配之前发生

 SharedAnyClass.obj= temp;  // assign object in thread 1
     

,因此将读取初始的空列表。

相关问题