У меня была проблема с блокировкой потока по какой-то еще неизвестной причине в моем приложении для Android, когда я пытался убить поток B из потока A (обычно, иногда это работало).Я догадался, что это потому, что некоторые из моих методов делали вызовы между потоками без синхронизации.Я сделал метод cancel и множество методов, которые по существу синхронизировали обработчики событий и сделали несколько общих переменных нестабильными, и все работало.
Я не знаю, какие из 20 нечетных объявлений volatile / synchronized я добавил на самом делерешил проблему, и это заставило меня задуматься: «Должен ли я заботиться? Это работает, не связывайтесь с этим!»
Итак, мой вопрос: Есть ли компромисс, связанный с объявлением метода синхронизированным?или примитивно изменчивый?Есть ли какая-либо причина избегать этих объявлений, если они не нужны?
Редактировать
Рассматриваемый поток (ы) - это соединение Bluetooth, которое получает / отправляет потоковую передачуданные, поэтому ASyncTask и другие решения типа рабочих потоков не работают хорошо.Они предназначены для выполнения конечной задачи и завершения по окончании.Некоторые, такие как ASyncTask, также добавляют много накладных расходов, которые просто убивают приложение.Для непрерывно работающих потоков, подобных этому, использование Thread по-прежнему является лучшим способом сделать это.
Я использую Android Сервис для создания и управления потоками, поэтому я следую парадигмам дизайна Android в этом отношении.