我读了所有有关线程安全类型和“锁定”语句的文档,但我仍然没有得到它100%.
当我完全需要使用“锁”语句?如何与(非)线程安全类型相关?谢谢.
解决方法
想象一下一个具有全局变量的类的实例.想象一下,两个线程在完全相同的时间调用该对象的方法,该方法更新了内部的全局变量.
变量的值可能会被破坏.不同的语言和编译器/口译员将以不同的方式(或根本不…)来处理这个问题,但是重点是你会得到“不需要的”和“不可预知的”结果.
现在想象该方法在尝试读取或写入该变量之前获得一个“锁定”.调用该方法的第一个线程将在该变量上获得一个“锁定”,调用该方法的第二个线程必须等到第一个线程释放该锁.尽管您仍然有竞争条件(即第二个线程可能会覆盖第一个线程)至少具有可预测的结果,因为没有两个线程(彼此不知道)可以同时修改该值.
您使用lock语句来获取该变量的锁定.通常,您将定义一个单独的对象变量,并将其用于锁定对象:
public class MyThreadSafeClass { private readonly object lockObject = new object(); private string mySharedString; public void ThreadSafeMethod(string newValue) { lock (lockObject) { // Once one thread has got inside this lock statement,any others will have to wait outside for their turn... mySharedString = newValue; } } }
如果共享数据被多个线程同时访问,则该类型被认为是“线程安全的”,如果它应用不会发生损坏的原则.
请注意“不可变”和“线程安全”之间的区别.线程安全性说,您已经为该场景编码,如果两个线程同时访问共享状态,则不会损坏,而不变性只是说您返回一个新对象,而不是修改它.不可变对象是线程安全的,但并不是所有的线程安全对象都是不可变的.