2012-07-13 15 views
5

Considerar siguiente código, quiero que sea una clase de seguro de rosca, de modo que nunca conseguirá número impar:¿Puedo usar sincronizado con un campo final?

class Test { 
    private int value = 0; 
    private final Object lock; 

    public void add() { 
    synchronized (lock) { 
     value++; 
     value++; 
    } 
    } 

    public int getValue() { 
    synchronized (lock) { 
     return value; 
    } 
    } 
} 

Ahora estoy duda del campo de bloqueo, que se declara a ser definitiva, ¿esto ¿importar? o romperá la seguridad del hilo?

Creo que si el campo de bloqueo no se declara como final, esta debería ser una clase segura para subprocesos. Si esta conclusión es incorrecta, por favor corrígeme, gracias.

+0

Consulte [this] (http://stackoverflow.com/questions/2101327/final-variable-and-synchronized-block-in-java) pregunta. – Lion

Respuesta

9

Ahora tengo dudas sobre el campo de bloqueo, que se declara definitivo, ¿será esto importante?

Sí, es considerada la mejor práctica a única bloquear final objetos de campo.

Si puede cambiar la referencia, puede cambiar qué objeto está bloqueado, rompiendo la seguridad del hilo.

0

En Java, la sincronización se realiza mediante un campo oculto del objeto de bloqueo. También significa que la REFERENCIA es definitiva, no el objeto en sí mismo.

Ejemplo:

final Bar bar = new Bar(); //bar hase property lock 
bar.lock = XYZ; //will work, object is not FINAL 
bar = new Bar(); //fail, the reference is FINAL 
+0

Por lo que vale, no hay una construcción incorporada para hacer 'objetos finales' en Java. La inmutabilidad debe ser implementada programáticamente. – corsiKa

1

debe estar bien. incluso podría hacerlo más seguro, ya que uno no puede simplemente asignar algo más al bloqueo durante la ejecución.

1

Si usted está buscando para bloquear un ejemplo, entonces final es aceptable. Si busca bloquear o poner un mutex en una clase, establezca la variable estática.

0

Cuando intenta sincronizar varios hilos, deben estar sincronizados en función de la misma referencia/instancia del objeto. Esto garantiza que ambos se sincronicen al mismo tiempo en función de los mismos datos.

Espero que tenga un poco de sentido; solo tiene que sincronizar en función de una variable finalizada en lugar de una dinámica.

Si un método modifica un campo estático, debe sincronizar el acceso a este campo, incluso si el método se utiliza normalmente por un solo hilo. No es posible que los clientes realicen una sincronización externa en tal método porque no puede haber ninguna garantía que los clientes no relacionados hagan lo mismo, see.

Cuestiones relacionadas