Tuve un problema con el bloqueo de un hilo por alguna razón aún desconocida en mi aplicación de Android cuando intentaba matar el hilo B del hilo A (por lo general, a veces funcionaba). Supuse que era porque algunos de mis métodos realizaban llamadas a través de los hilos sin estar sincronizados. Hice el método de cancelar y muchos métodos que esencialmente eran controladores de eventos sincronizados e hizo que algunas variables compartidas fueran volátiles y todo funcionó.¿Intercambiar con el método de declaración sincronizado en java?
No sé cuál de las 20 extrañas declaraciones volátiles/sincronizadas que agregué realmente resolvió el problema, y eso me hizo pensar: "¿Debería importarme? ¡Funciona, no te metas con eso!"
Por lo tanto, mi pregunta es: ¿Hay alguna compensación asociada con la declaración de un método sincronizado o una primitiva volátil? ¿Hay alguna razón para evitar estas declaraciones si no son necesarias?
Editar
El hilo (s) en cuestión es una conexión Bluetooth que está recibiendo/enviando los datos de streaming, por lo AsyncTask y otras soluciones de tipo subproceso de trabajo no funcionan bien. Están diseñados para realizar una tarea finita y terminar cuando esté terminado. Algunos, como ASyncTask, también agregan muchos sobrecargas que simplemente matan la aplicación. Para ejecutar continuamente hilos como este, utilizar un hilo sigue siendo la mejor manera de hacerlo.
Estoy usando un android Service para generar y administrar los hilos, así que estoy siguiendo los paradigmas de diseño de Android a ese respecto.
Hay una (pequeña) penalización de rendimiento inherente. Es difícil decir cuál fue el "problema con el bloqueo de un hilo" (sondear un campo de miembro no volátil?), Pero agregar libremente sonidos "sincronizados" es una buena manera de lograr un punto muerto, y cómo sabes que tu aplicación es libre de condiciones de carrera?El gran problema es que tiene un * lote * de estado compartido entre subprocesos: necesita decidir qué se debe compartir, asegurarse de que el estado compartido sea seguro para subprocesos (haciendo que la mayor cantidad de ayuda posible sea inmutable) y decidir cómo se comunican los subprocesos. (¿Handler/ConcurrentLinkedQueue/LinkedBlockingQueue?). –