锁定&验证或验证&锁?

时间:2011-06-29 09:12:14

标签: c# multithreading validation locking

假设您将数组作为参数传递给给定方法,例如

public static DoSomething (string[] array)
{
    // Do something with array here.
}

并且在方法内部使用一些指令,如果array包含无效数据,则会引发异常。在多线程环境中,多个线程可能正在访问array,您应按什么顺序进行操作?

1)锁定阵列以确保同时只有一个线程对其进行操作,并在锁定后验证它,一旦完成工作就释放锁定;或

2)立即检查阵列的有效性,如果有效,请将其锁定并开始工作。

2 个答案:

答案 0 :(得分:5)

如果为“null”,则无法锁定“数组”;但无论如何无关紧要< - > - 参考不能改变;即使内容发生变化,它仍然是相同的参考。因此,您可以推迟锁定,直到您对内容感兴趣。

所以:

  • null check
  • 检查内容/使用内容

如果您的意思是一般有效性 - 这取决于是否有任何线程会更改内容。如果不是......嗯,不需要锁。如果他们 更改内容,则需要在验证之前锁定,否则您的验证没有实际意义。

答案 1 :(得分:2)

我相信方法中的代码不需要锁定作为参数传递的项。相反,来电者应该这样做!!

这是责任链的问题:访问共享数据的对象(即类中的静态字段)应该进行空检查和锁定,并且应该对其输入进行操作的方法不应该考虑任何多线程问题,假设该参数仅由它使用。

这只是我的意见,所以

  • 空检查
  • 锁定
  • 致电方法
  • 返回时解锁