c# – 什么是一个“线程安全类型”?我们什么时候需要使用“锁”语句?

我读了所有有关线程安全类型和“锁定”语句的文档,但我仍然没有得到它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;
        }
    }
}

如果共享数据被多个线程同时访问,则该类型被认为是“线程安全的”,如果它应用不会发生损坏的原则.

请注意“不可变”和“线程安全”之间的区别.线程安全性说,您已经为该场景编码,如果两个线程同时访问共享状态,则不会损坏,而不变性只是说您返回一个新对象,而不是修改它.不可变对象是线程安全的,但并不是所有的线程安全对象都是不可变的.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...