猿问

在 Java 中分配 List 是线程安全的吗?

我搜索并发现分配对象是线程安全的(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

    }      

 }

}

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


一只甜甜圈
浏览 150回答 1
1回答

慕尼黑5688855

这段代码是错误的。线List&nbsp;temp&nbsp;=&nbsp;SharedAnyClass.obj;可以在分配之前发生&nbsp;SharedAnyClass.obj=&nbsp;temp;&nbsp;&nbsp;//&nbsp;assign&nbsp;object&nbsp;in&nbsp;thread&nbsp;1所以会读取初始的空列表。
随时随地看视频慕课网APP

相关分类

Java
我要回答