Try-finally is our friend

“Gimme back my bullets
Put ‘em back where they belong…”
(“Gimme back my bullets”, Lynyrd Skynyrd, 1976)

Repasando los comentarios (algunos míos) a los tres posts sobre el uso de la sentencia lock publicados recientemente por mis PLAIN-hermanos Pablito, Unai y Rodrigo, encontré un fragmento de código que me ha dado la idea para éste, relacionado con la necesidad de utilizar patrones tryfinally (o alguna de las sentencias que se apoyan en ellos, como using o lock) siempre que se soliciten recursos de cualquier naturaleza, para garantizar su devolución.

El fragmento de código en cuestión es similar a éste:

class LockDemo
{
    private static object locker = new object();
    public void MethodA()
    {
        System.Threading.Monitor.Enter(locker);
        // synchronized work
        System.Threading.Monitor.Exit(locker);
    }
}

¡Norrrrr!, Chiquitus dixit. Si por cierta razón quisiéramos utilizar explícitamente la clase Monitor en nuestro código, la manera correcta, que garantiza la liberación del bloqueo del objeto de sincronización incluso si se produce alguna excepción no gestionada durante el trabajo sincronizado, sería:

class LockDemo
{
    private static object locker = new object();
    public void MethodA()
    {
        System.Threading.Monitor.Enter(locker);
        try
        {
            // synchronized work
        }
        finally
        {
            System.Threading.Monitor.Exit(locker);
        }
    }
}

Si se revisa la especificación del lenguaje, se verá que ésa es exactamente la semántica de la sentencia lock:

class LockDemo
{
    private static object locker = new object();
    public void MethodA()
    {
        lock (locker)
        {
            // synchronized work
        }
    }
}

En mis cursos siempre insisto hasta el aburrimiento en la necesidad, de cara a una programación robusta, de que al programador se le meta en la sangre la obligación de devolver, ASAP (a la mayor brevedad posible) y no matter what (pase lo que pase), cualquier recurso que pida prestado a su entorno. Hacer otra cosa es simplemente escribir programas que van dejando (si se me perdona la expresión) una estela de mierdaproblemas detrás de sí.


Pop/rock tip: No es la primera vez que mencionamos a Lynyrd Skynyrd en este blog. “Gimme back my bullets” daba título a su cuarto álbum, salido en 1976, casi simultáneamente con el directo del que ya hemos hablado y un año antes del trágico accidente de aviación que le costó la vida a su líder, Ronnie Van Zant, y a dos miembros más de la banda.

 

Octavio Hernandez

Desarrollador y consultor en tecnologías .NET. Microsoft C# MVP entre 2004 y 2010.

3 comentarios en “Try-finally is our friend

  1. Ese Octavio!! Excelente post, y consejo muy, pero que muy importante el tuyo de ir ‘limpiando la estela de mierda’ (sabes que como soy heavy, me quedo con la frase sin censurar!).

    Maravilloso también el Rock Tip; tengo el día sureño y los Lynyrd me han llegado 😉

    En fin, como siempre, un excelente articulo!

    Un abrazote!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *