2012-06-03 7 views
12

¿Hay alguna diferencia entre:lock.lock() antes de intentar

private Lock lock = new ReentrantLock(true); 

public void getIn (int direction) throws InterruptedException { 

    lock.lock(); 
    try { 
     ... 

y

... 

public void getIn (int direction) throws InterruptedException { 

     try { 
      lock.lock(); 
      ... 

Compilación va sin problemas y también funciona el programa (me refiero a la misma salida)

Debería poner lock.lock(); antes o después de tratar ...

Gracias por cualquier ayuda

+1

¿Qué clase es 'lock'? – Thor

+1

¿Qué está atrapado? Si luego atrapa 'ExceptionThatLockCannotThrow' - en realidad no hay ninguna diferencia entre ellos – amit

+0

Algunos statemen before: private Lock lock; y luego lock = new ReentrantLock (verdadero); gracias ... la operación de desbloqueo se realiza al final; finalmente} lock.unlock(); – 9628001

Respuesta

0

En primer caso:? si el lock.lock()InterruptedException tiros, getIn se gestionarlo. Sin embargo, para cualquier otra excepción, sería una excepción, que no lo hace getIn asas: excepción de ejecución

En segundo caso: además de InterruptedException, el bloque try-catch también está haciendo un tratamiento de excepciones, que no se ha mostrado aquí. Esto debería arrojar excepciones menores, ya que el bloque interno también está capturando algunas excepciones.

El funcionamiento general depende de qué excepciones lock.lock() arroja?

+0

El método ['lock()'] (http://download.java.net/jdk8/docs/api/java/util/concurrent/locks/ReentrantLock.html#lock--) no arroja InterruptedExceptions.El bloque en el método 'getIn' es en realidad un bloque' try-finally', no un 'try-catch'. –

9

Suponiendo que lock es un lock, entonces no hay diferencia real, ya que lock() no arroja ninguna excepción marcada.

La documentación de Java, sin embargo, deja lock() fuera del bloque try en el ejemplo ReentrantLock. La razón para esto es que una excepción sin marcar en lock() no debe llevar a que se llame incorrectamente al unlock(). Si la corrección es una preocupación en presencia de una excepción sin marcar en lock() de todas las cosas, esa es otra discusión en conjunto.

Es una buena práctica de codificación, en general, mantener los bloques try tan finos como sea posible.

4

La sentencia try también contiene:

} finally { 
    lock.unlock(); 
} 

Es decir, si se coloca lock.lock() después try, excepciones lanzadas por lock.lock() causarían lock.unlock(), lo cual es incorrecto, porque no se obtuvo bloqueo y desbloqueo causaría otra excepción Entonces la primera variante es correcta. Para manejar las excepciones lanzadas por lock.lock(), debe usar otra instrucción try.

9

Si es el caso n. ° 1, en finally puede simplemente decir unlock(). En el caso No2, debe verificar si está presionando el candado antes de unlock(), de lo contrario, puede obtener IllegalMonitorStateException

Cuestiones relacionadas