Miałem problem z zablokowaniem wątku z nieznanego powodu w mojej aplikacji na Androida, gdy próbowałem zabić wątek B z wątku A (zazwyczaj czasami zadziałało). Podejrzewałem, że to dlatego, że niektóre z moich metod nawiązywały połączenia przez wątki bez synchronizacji. Zrobiłem metodę anulowania i wiele metod, które były zasadniczo procedurami obsługi zdarzeń zsynchronizowane i uczyniły kilka wspólnych zmiennych zmiennymi i wszystko działało.Zwalczaj z deklarowaniem metody synchronizowanej w java?
Nie wiem, który z 20 dziwnych lotnych/zsynchronizowanych deklaracji, które dodałem, faktycznie rozwiązał problem, a to spowodowało, że pomyślałem: "Czy powinienem się przejmować? To działa nie zadzieraj!"
Moje pytanie brzmi: Czy istnieje jakikolwiek kompromis związany z deklarowaniem metody zsynchronizowanej lub prymitywnej? Czy jest jakiś powód, aby unikać tych deklaracji, jeśli nie są one potrzebne?
Edit
Gwint (y) w pytaniu jest połączenie Bluetooth, które odbiera/wysyła dane strumieniowe, więc ASyncTask i inne rozwiązania typu gwintu pracownik nie działają dobrze. Są one zaprojektowane do wykonywania zadań skończonych i kończenia po zakończeniu. Niektóre, takie jak ASyncTask, również dodają wiele kosztów, które po prostu zabijają aplikację. W przypadku nieprzerwanych wątków takich jak ten, używanie wątku jest nadal najlepszym sposobem na zrobienie tego.
Używam Androida Service do generowania wątków i zarządzania nimi, więc podążam za wzorami projektowymi Androida pod tym względem.
Istnieje (mała?) Nieodłączna kara za wydajność. Trudno powiedzieć, jaki był "problem z blokowaniem wątku" (odpytywanie nieulotnego pola składowego?), Ale dobrowolne dodanie "zsynchronizowanego" brzmi jak dobry sposób na uzyskanie impasu i skąd wiadomo, że twoja aplikacja jest wolny od warunków wyścigu?Największym problemem jest to, że masz * dużo * współdzielonego stanu między wątkami - musisz zdecydować, co należy udostępnić, upewnić się, że współdzielony stan jest bezpieczny dla wątków (w jak największym stopniu niezmienny pomaga) i zdecydować, w jaki sposób komunikować się z wątkami (Handler/ConcurrentLinkedQueue/LinkedBlockingQueue?). –