如果一个方法(实例或静态)仅引用该方法范围内的变量,则它是线程安全的,因为每个线程都有自己的堆栈:
在这种情况下,多个线程可以ThreadSafeMethod
并发调用而不会出现问题。
public class Thing
{
public int ThreadSafeMethod(string parameter1)
{
int number; // each thread will have its own variable for number.
number = parameter1.Length;
return number;
}
}
如果该方法调用仅引用局部作用域变量的其他类方法,则也是如此:
public class Thing
{
public int ThreadSafeMethod(string parameter1)
{
int number;
number = this.GetLength(parameter1);
return number;
}
private int GetLength(string value)
{
int length = value.Length;
return length;
}
}
如果方法访问任何(对象状态)属性或字段(实例或静态),则需要使用锁以确保值不会被其他线程修改。
public class Thing
{
private string someValue; // all threads will read and write to this same field value
public int NonThreadSafeMethod(string parameter1)
{
this.someValue = parameter1;
int number;
// Since access to someValue is not synchronised by the class, a separate thread
// could have changed its value between this thread setting its value at the start
// of the method and this line reading its value.
number = this.someValue.Length;
return number;
}
}
您应该意识到,传递给该方法的任何不是结构也不是不可变的参数都可能被该方法范围之外的另一个线程所突变。
为了确保适当的并发性,您需要使用锁定。
有关更多信息,请参见锁语句C#参考和ReadWriterLockSlim。
锁对于一次提供一个功能
ReadWriterLockSlim
最有用,如果需要多个读取器和单个写入器,则锁定很有用。