2011-09-04 23 views
6

en el punto 67 de Effective Java por Josh Bloch, mencionó que si un método modifica un campo estático, debe sincronizar el acceso a este campo, ya que no es posible para los clientes para llevar a cabo la sincronización externa sobre tales un método. No entiendo por qué un cliente no puede realizar la sincronización externa en un método estático.sincronizar el acceso a un campo estático

aplicación de sincronización interna:

public class Serial { 
    private static int serialNumber = 0; 

    public synchronized static void incSerial() { 
     serialNumber++; 
    } 

} 

si no hay sincronización interna implementada, un cliente puede sincronizar externamente:

synchronize(Serial.class) { 

    Serial.incSerial(); 
} 

alguna idea?

+1

Por cierto, puede proporcionar un presupuesto exacto, y háganos saber la página que está escrito. Esperaría que Bloch fuera claro y correcto – Bozho

Respuesta

6

Un cliente puede hacer eso, pero no se puede forzar una sincronización tal. Entonces, algún cliente puede hacer un acceso no sincronizado y romper todo.

+1

, el ejemplo sería trivial: un cliente sincroniza, el otro no. Por lo tanto, varios hilos que usan el código no sincronizado son propensos a problemas de sincronización – Bozho

0

Usted necesita asegurarse de que se utiliza el bloqueo asociado a la clase que contiene la variable de instancia estática. Si lo adquiere con un bloque sincronizado antes y luego llama al método estático, está bien. Pero no puede aplicar esto en el código del cliente. Pueden olvidar o no ser conscientes de que la variable estática particular también es utilizada por otros hilos. Así que aplicarlo, como sugirió Bozho, al sincronizar el método estático y hacer que la variable de instancia sea privada sería el mejor enfoque.

Tiberiu

+0

Chicos, una cosa más importante. En esa cita, Bloch ha mencionado que "debe sincronizar el acceso a este campo, incluso si lo utiliza un único hilo". Si es utilizado por un solo hilo, ¿por qué es necesario sincronizarlo? – Hitesh

Cuestiones relacionadas