锁定并验证或验证并锁定?

Use*_*ser 2 c# validation multithreading locking

假设您将一个数组作为参数传递给给定的方法,比方说,

public static DoSomething (string[] array)
{
    // Do something with array here.
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*ell 5

如果为"null",则无法锁定"数组"; 但无论如何都没关系- 参考不能改变; 即使内容发生变化,它仍然是相同的参考.因此,您可以推迟锁定,直到您对内容感兴趣为止.

所以:

  • 空检查
  • 检查内容/使用内容

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