Java Array lista sincronización si está escrito en un hilo y leído en otro

Tengo una clase de controlador que se ejecuta en el hilo A y compone una lista de variables locales como este

Hilo

list = new ArrayList<Map<String, Order>>(); list.add(...); list.add(...); 

donde Order es un java con varias propiedades primitivas como String, int, long, etc.

Una vez construida esta lista, su referencia se pasa a un hilo de UI (hilo B) de Actividad y se accede allí. La comunicación entre hilos se realiza mediante un método Handler class + post ().

Así que la pregunta es, ¿puedo acceder a los datos de la lista del hilo B sin sincronización en absoluto? Tenga en cuenta que, después de haber sido construido en el hilo A, no se accederá / modificará la lista en absoluto. Simplemente existe como una variable local y se pasa al hilo B después.

No está claro del contexto que usted proporciona que dónde sucede esto:

 list = new ArrayList<Map<String, Order>>(); list.add(...); list.add(...); 

Si está en un constructor y la list es final y this referencia no se filtra desde el constructor y está absolutamente seguro de que la list no cambiará (por ejemplo, utilizando el método unmodifiableList decorator) y las referencias a las instancias Order no son accesible desde cualquier lugar que no sea adecuado para no utilizar la sincronización. De lo contrario, tendrá Espada de Damocles sobre su cabeza.

He mencionado las referencias de la Order porque no puede obtener excepciones si las cambia desde otro lugar, pero puede conducir a la inconsistencia / corrupción de los datos.

Es seguro. La sincronización realizada en la cola de mensajes establece una relación de sucede-antes. Esto por supuesto asume que usted no modifica los mapas después. También cualquier objeto contenido en los mapas, y así sucesivamente no debe ser modificado por otros hilos sin la sincronización apropiada.

En resumen, si la lista y ninguno de los datos dentro de ella no son modificados por otros subprocesos que B, no necesita ninguna sincronización adicional.

Si puede garantizar que la lista no se modificará, entonces no necesita sincronización ya que todos los hilos siempre verán la misma Lista.

Sí, no hay necesidad de sincronizar si sólo va a leer los datos.

Tenga en cuenta que incluso si el subproceso A va a modificar eventualmente la lista mientras que el subproceso B (o cualquier otro número de subprocesos) está accediendo a él, todavía no tiene que sincronizar porque sólo hay un escritor en un momento dado.

Lo sentimos, la declaración anterior no es completamente correcta. Como se indica en el JavaDoc:

Si varios subprocesos tienen acceso simultáneamente a una instancia de ArrayList y al menos uno de los subprocesos modifica la lista estructuralmente, debe sincronizarse externamente. (Una modificación estructural es cualquier operación que añade o elimina uno o más elementos, o redimensiona explícitamente la matriz de respaldo, simplemente establecer el valor de un elemento no es una modificación estructural ).

También tenga en cuenta que no estoy teniendo en cuenta la modificación de elementos, sino simplemente modificaciones de lista.

  • Fragmento de Android y referencia de objeto nulo
  • Androide. ARTE para el error de optimización de bucle. Función java simple con resultado inesperado
  • Comportamiento extraño en la sentencia do / while en Galaxy S5 y Android 5.1.1
  • La recolección de basura no se activa en la aplicación cuando se habilita LargeHeap, lo que resulta en OOM
  • No se pudo escribir el volcado de núcleo. Minidumps no están habilitados de forma predeterminada en las versiones de cliente de Windows en Eclipse
  • ¿Cuál es la diferencia entre `opencv.android.JavaCameraView` y` opencv.android.NativeCameraView`
  • Programación Android de fondo de cultivo
  • Cómo centrar un ImageView verticalmente en su matriz?
  • Envolvente de texto de Android
  • Cómo cambiar el color de resaltado en el campo editText
  • Error al guardar la imagen en sdcard
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.