这确实可能不是一个好主意,因为如果其他人使用相同的对象引用来执行 a 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
实例不再被锁定。
我同意,这种情况不太可能发生,但它说明如果您的锁定引用在一段您不拥有的代码中可见,以任何可能的方式,那么最终代码有可能被破坏。