2010-04-16 10 views
6

Esto puede parecer una pregunta muy tonta. Considere esto:El acceso/escritura al objeto booleano necesita sincronización

Tengo un objeto booleano simple con un captador y un colocador. Ahora ambos métodos son llamados de muchos hilos con mucha frecuencia.

  1. ¿Necesito tener una sincronización para este booleano?
  2. También son asignaciones booleanas operaciones atómicas?

[ACTUALIZACIÓN]: que sé de Boole ya Atómica. Ya tengo muchas soluciones variadas, pero estaba específicamente buscando respuestas y justificación de respuestas para la pregunta 2 anterior.

+1

1) sí 2) no. – Tom

+0

¿Está creando una clase 'Boolean' distinta de la clase' java.lang.Boolean'? –

Respuesta

10

No, el acceso booleano NO es atómico (en el nivel de código de máquina), aunque toma "solo 1 operación en Java".

Por lo tanto, sí, necesita sincronización para Boolean.

Consulte las diapositivas 4-6 de this presentation para ver ejemplos de código.

En una nota relacionada, you should not synchronize on a Boolean

+1

sincronizado +1 para una buena referencia –

+0

@DVK .... "no debe sincronizar en un booleano" ..... puede gerenalizarlo y decir que nunca se sincronice en no- objetos finales. –

+1

Es x = verdadero; atómico o no? x es booleano –

2
+0

gracias, ya sé de Atomic Boolean. Ya tengo muchas soluciones variadas, pero estaba específicamente buscando respuestas y justificación de respuestas para la pregunta 2 anterior. –

+0

Depende de la representación interna del objeto de 32 bits o de 64 bits? Creo que este último definitivamente tendrá problemas. No estoy seguro acerca de 32 bits sin embargo. Solo para estar seguro de sincronizarlos. Si se trata de un solo objeto, AtomicXXXX es más rápido que –

3
  1. Sí. Pero si se trata de un indicador que está escrito a partir de un solo subproceso y desea garantizar la visibilidad de todos los hilos, entonces una alternativa barata es usar volatile.

  2. Sí - a pesar de que la representación interna del objeto (es decir, el boolean bandera real dentro de la Boolean wrapper) eran de 64 bits y por lo tanto podría conseguir "split" en una situación concurrente, un booleano sólo puede tener una de las dos valores, ¿verdad? Las asignaciones tan simples (consiga o conjunto) son atómicas, pero si está haciendo otra cosa (como verificar y actuar), por ejemplo x = !x, entonces, por supuesto, no es atómico a menos que esté sincronizado.

+0

¿Por qué 'volátil' no es una solución válida si la bandera se está escribiendo en más de un hilo? –

+0

@Aeth: puede ser una solución válida en algunas situaciones, pero carece de las operaciones CompareAndSet de AtomicBoolean/funcionalidad similar lograda mediante el uso de sincronización. Si el valor de escritura depende del valor actual de la variable, entonces 'volátil' no es una opción para la escritura multiproceso. Pero tiene sus usos, por supuesto. –

3
  1. Desde una perspectiva técnica, no es necesaria la sincronización para las escrituras en un hilo para ser percibidos en otro hilo. Lo que necesita es un sucede antes del borde. Es probable que volatile o synchronized se usen para lograr el límite anterior. Ambas técnicas dan como resultado un borde sincronizado. Entonces, en la práctica, probablemente usará la sincronización para administrar el estado de su booleano.
  2. Sí. Tenga en cuenta que no está cambiando el estado del objeto booleano. Solo está modificando la referencia al objeto booleano. La sección 17.7 de la especificación del lenguaje establece que "escribe y lee referencias siempre son atómicas".

Actualización: Permítanme exponer sobre la necesidad de un borde anterior. Sin una ventaja anterior, los cambios que un hilo hace a la variable nunca serán percibidos por los otros hilos. No es simplemente que el cambio se perciba en un mal momento, como entre una lectura y una escritura.El cambio puede nunca ser percibido.

Digamos que tenemos una variable booleana que inicializamos en falso. Entonces comenzamos dos hilos. El primer hilo establece la variable en verdadero y se detiene. El segundo hilo comprueba continuamente la variable hasta que sea verdadera, después de lo cual se detiene. No hay garantía de que el segundo subproceso vea la variable como verdadera.

0

incluso si era atómico todavía hay isncronization isues ya que probablemente comprobará el valor alguna vez p. if (boolVar == true) -> otro hilo toma el control do_something();

1
  1. No, no es así. Pero declare la variable volatile para que los valores se reflejen en todos los hilos que acceden al booleano. Si observa el método AtomicBooleanset(..), tampoco tiene ninguna sincronización.

  2. Sí, la asignación práctica es atómica. Simplemente establecer el valor no necesita sincronización. Sin embargo, si quieres hacer algo como:

    if (!bool) { 
        bool = false; 
    } 
    

    entonces necesita la sincronización (o AtomicBoolean, que es más eficiente que la sincronización)

Cuestiones relacionadas