Export (0) Print
Expand All

Do not lock on objects with weak identity

TypeName

DoNotLockOnObjectsWithWeakIdentity

CheckId

CA2002

Category

Microsoft.Reliability

Breaking Change

Non Breaking

A thread attempts to acquire a lock on an object that has a weak identity.

An object is said to have a weak identity when it can be directly accessed across application domain boundaries. A thread that tries to acquire a lock on an object that has a weak identity can be blocked by a second thread in a different application domain that has a lock on the same object. The following types have a weak identity and are flagged by the rule:

To fix a violation of this rule, use an object from a type that is not in the list in the Description section.

Do not suppress a warning from this rule.

The following example shows some object locks that violate the rule.

using System;
using System.IO;
using System.Reflection;
using System.Threading;

namespace ReliabilityLibrary
{
   class WeakIdentities
   {
      void LockOnWeakId1()
      { 
         lock(typeof(WeakIdentities)) {}
      }

      void LockOnWeakId2() 
      {
         MemoryStream stream = new MemoryStream();
         lock(stream) {} 
      }

      void LockOnWeakId3() 
      { 
         lock("string") {} 
      }

      void LockOnWeakId4() 
      { 
         MemberInfo member = this.GetType().GetMember("LockOnWeakId1")[0];
         lock(member) {} 
      }
      void LockOnWeakId5()
      {
         OutOfMemoryException outOfMemory = new OutOfMemoryException();
         lock(outOfMemory) {}
      }
   }
}

Community Additions

ADD
Show:
© 2014 Microsoft