2011-04-15 7 views
9

En el libro de Brian Goetz, Java concurrencia en la práctica, su ejemplo de una cerradura Reentrante se programa como esto:¿Hacer estático el Reentrant Lock y convertirlo en un mutex?

Lock lock = new ReentrantLock(); 

Sin embargo, tengo curiosidad por saber si se cambia el código anterior para:

private static final Lock lock = new ReentrantLock(); 

hace que el bloqueo actúe ahora como un mutex, o si es innecesario y redundante.

Por lo tanto, ¿la funcionalidad de este código cambia si el bloqueo se hace privado, estático y final?

lock.lock(); 
try { 
    //method stuff 
} finally { 
    lock.unlock(); 
} 

Gracias a todos de antemano. Matt

Respuesta

18

Sí.

final y private no tienen ninguna influencia, por supuesto, pero static significa que todas las instancias comparten el mismo candado.

Así que si tiene dos instancias, el bloque de código no puede ejecutarse por dos hilos al mismo tiempo.

Si el bloqueo no es estático, cada instancia obtiene su propio bloqueo. Eso significa que más hilos pueden ejecutar el código al mismo tiempo (dependiendo de qué instancia funcionan, por supuesto).

+0

perfecto. Gracias. –

+1

Consulte también http://www.ibm.com/developerworks/java/library/j-jtp10264/ para obtener más información sobre bloqueos frente a la palabra clave sincronizada. –

+0

Perdón por excavar esta publicación, pero estoy buscando este tema ahora. ¿Me interesa si la creación de un 'bloqueo de ReentrantLock final estático privado 'no se considera un olor a código? He leído que las variables estáticas son malas, pero mi caso de uso actual en el que estoy trabajando parece el lugar ideal para usarlo. Cuidado para ayudar? – Bobzone

3

Creación de un bloqueo estático se equivallent a

synchronized(MyClass.class){ 

} 

Su esencia en una cerradura nivel de clase

+0

No exactamente. La clase es pública, cualquier persona que llama puede realizar el bloqueo. El bloqueo Reentrant especificado es privado, por lo que solo la clase puede acceder a ese bloqueo. –

+0

Usted está asumiendo que la clase es pública y no es un niño, privado, protegido o protegido por paquete. Sin embargo, mi respuesta fue más para demostrar la relación entre la cerradura y la clase. –

Cuestiones relacionadas