include::../why-dotnet.adoc[]

== How to fix it

To make sure that a lock is always released correctly, you can follow one of these two methods:

* Use a https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/lock[`lock`] statement with your lock object.
* Use a https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/exception-handling-statements#the-try-finally-statement[`try-finally`] statement and put the release of your lock object within the finally block.

=== Code examples

==== Noncompliant code example

[source,csharp,diff-id=1,diff-type=noncompliant]
----
class MyClass 
{
  private object obj = new object();

  public void DoSomethingWithMonitor() 
  {
    Monitor.Enter(obj); // Noncompliant: not all paths release the lock
    if (IsInitialized())
    {
      // ...
      Monitor.Exit(obj);
    }
  }
}
----

[source,csharp,diff-id=2,diff-type=noncompliant]
----
class MyClass 
{
  private ReaderWriterLockSlim lockObj = new ReaderWriterLockSlim();
  
  public void DoSomethingWithReaderWriteLockSlim() 
  {
    lockObj.EnterReadLock(); // Noncompliant: not all paths release the lock
    if (IsInitialized())
    {
      // ...
      lockObj.ExitReadLock();
    }
  }
}
----

==== Compliant solution

[source,csharp,diff-id=1,diff-type=noncompliant]
----
class MyClass 
{
  private object obj = new object();

  public void DoSomethingWithMonitor() 
  {
    lock(obj) // Compliant: the lock will be released at the end of the lock block
    {
      if (IsInitialized())
      {
        // ...
      }
    }
  }
}
----

[source,csharp,diff-id=2,diff-type=noncompliant]
----
class MyClass 
{
  private ReaderWriterLockSlim lockObj = new ReaderWriterLockSlim();

  public void DoSomethingWithReaderWriteLockSlim() 
  {
    lockObj.EnterReadLock(); // Compliant: the lock will be released in the finally block
    try
    {
      if (IsInitialized())
      {
        // ...
      }
    }
    finally
    {
      lockObj.ExitReadLock();
    }
  }
}
----

include::../resources-dotnet.adoc[]

* https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/lock[`lock` statement]
* https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/exception-handling-statements#the-try-finally-statement[The `try-finally` statement]

include::../rspecator.adoc[]
