#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 потокобезопасен, но вам не гарантируется, что полученный вами результат соответствует действительности. Это важный фактор, который следует принимать во внимание, но он может вас не беспокоить в зависимости от того, для чего предназначен список.