назначение списка является потокобезопасным в Java? - PullRequest
0 голосов
/ 25 февраля 2019

Я искал и обнаружил, что назначающий объект является потокобезопасным (кроме long, double type). Я хочу подтвердить, что следующий код является потокобезопасным.

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 читает общий список дляцикл, Writer поток может назначить общий список в потоке безопасно.В этом случае поток Reader все еще может читать общий список List for для старого общего объекта List.Когда поток Reader попытается выполнить функцию run () позже, он прочитает новый общий объект List.Это правильно?

1 Ответ

0 голосов
/ 25 февраля 2019

Этот код неверен.Строка

List temp = SharedAnyClass.obj;

может находиться перед присваиванием

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

и поэтому будет читать начальный пустой список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...