他の誰かが同じオブジェクト参照を使用してlock
. ロックされたオブジェクトが自分のコードの外からアクセスできる可能性がある場合、他の誰かがあなたのコードを壊す可能性があります。
コードに基づいて次の例を想像してください。
namespace ClassLibrary1
{
public class Foo : IProduct
{
}
public interface IProduct
{
}
public class MyClass
{
public List<IProduct> myOriginalProductList = new List<IProduct> { new Foo(), new Foo() };
public void Test(Action<IEnumerable<IProduct>> handler)
{
List<IProduct> otherProductList = new List<IProduct> { new Foo(), new Foo() };
Parallel.ForEach(myOriginalProductList, product =>
{
lock (otherProductList)
{
if (handler != null)
{
handler(otherProductList);
}
otherProductList.Add(product);
}
});
}
}
}
次に、ライブラリをコンパイルして顧客に送信すると、この顧客は自分のコードに次のように記述します。
public class Program
{
private static void Main(string[] args)
{
new MyClass().Test(z => SomeMethod(z));
}
private static void SomeMethod(IEnumerable<IProduct> myReference)
{
Parallel.ForEach(myReference, item =>
{
lock (myReference)
{
// Some stuff here
}
});
}
}
otherProductList
次に、インスタンスがロックされなくなるのを待っている 2 つの使用済みスレッドのそれぞれで、顧客にとってデバッグが困難なデッドロックが発生する可能性があります。
このシナリオが発生する可能性は低いことに同意しますが、ロックされた参照が所有していないコードの一部に表示されている場合、最終的なコードが破損する可能性があることを示しています。