Потоки Java (Android), обращающиеся к тому же списку

#java #android #multithreading #thread-safety #synchronized

#java #Android #многопоточность #безопасность потоков #синхронизировано

Вопрос:

Я новичок в Java и Android, так что потерпите меня.

У меня есть один ArrayList строк, который я заполняю в основном пользовательском интерфейсе.

У меня есть другой поток, который отправляет одну за другой строки ArrayList через сокет, и после отправки каждой из них он удаляет ее из списка.

Итак, по сути, это FIFO, с двумя разными потоками, обращающимися к одному и тому же ArrayList.

Как я могу сделать это чтение и запись в одном списке потокобезопасными? Потому что я прочитал, что я должен, таким образом предотвращая будущие ошибки.

Моей первой мыслью было создать синхронизированный метод для доступа к ArrayList.

Это метод, который я создал для доступа к ArrayList обоими потоками.

 public synchronized String accessArrayList(boolean add, boolean get, String utt)
{
    if(add){            
        mStrings.add(utt);
        return null;
    }
    else if(get){
        return mStrings.get(0);

    }
    else{
        mStringsUttComm.remove(0);
        return null;
    }


}
  

Основной поток просто добавляет строки в этот список.

Второй поток выполняет это :

 Runnable runner = new Runnable() {
      public void run() {
          while(!mString.isEmpty()){
                              //socket sends string               
              sc.actionPerformed(accessArrayList(false, true, null));
                              //erase from list
              accessArrayList(false, false, null);
          }

      }
};
  

Правильно ли это? Потому что я новичок в eclipse и не могу найти способ подтвердить, что один поток не вызывает accessArrayList, если другой его использует.

Спасибо за ваше время.

Ответ №1:

Взгляните на векторы и синхронизацию :

Векторы : http://download.oracle.com/javase/1.4.2/docs/api/java/util/Vector.html

Синхронизация: http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html

Комментарии:

1. 1 я @cornelyus использую vector при использовании в потоке, а для обычного метода использую arraylist.

2. Спасибо .. Не знал о классе Vector, посмотрю. Еще раз протестировал то, что я сделал, и, похоже, это работает.. С Vector не было бы необходимости создавать синхронизированный метод, который я сделал, правильно?

3. Как насчет CopyOnWriteArrayList? developer.android.com/reference/java/util/concurrent /…

4. Векторы синхронизированы, поэтому вы правы, что бы вы ни делали с его содержимым, синхронизация позаботится о вас.

5. CopyOnWriteArrayList потокобезопасен, но вам не гарантируется, что полученный вами результат соответствует действительности. Это важный фактор, который следует принимать во внимание, но он может вас не беспокоить в зависимости от того, для чего предназначен список.