gpt4 book ai didi

c# - "thread-safe type"到底是什么?我们什么时候需要使用 "lock"语句呢?

转载 作者:可可西里 更新时间:2023-11-01 08:59:51 27 4
gpt4 key购买 nike

我阅读了所有关于线程安全类型和“锁定”语句的文档,但我仍然没有 100% 理解它。

具体什么时候需要使用“lock”语句?它与(非)线程安全类型有何关系?谢谢。

最佳答案

想象一个类的实例,里面有一个全局变量。想象一下,两个线程同时对该对象调用一个方法,并且该方法更新内部的全局变量。

变量中的值很可能会被破坏。不同的语言和编译器/解释器会以不同的方式处理这个问题(或者根本不处理......)但关键是你会得到“不希望的”和“不可预测的”结果。

现在假设该方法在尝试读取或写入变量之前获得变量的“锁”。第一个调用该方法的线程将获得变量的“锁”,第二个调用该方法的线程必须等到第一个线程释放锁。虽然您仍然存在竞争条件(即第二个线程可能会覆盖第一个线程的值),但至少您有可预测的结果,因为没有两个线程(彼此不知道)可以同时修改该值。

您使用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;
}
}
}

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

注意“不可变”和“线程安全”之间的区别。线程安全表示您已经针对该场景进行了编码,并且如果两个线程同时访问共享状态也不会损坏,而不变性只是表示您返回一个新对象而不是修改它。不可变对象(immutable对象)是线程安全的,但并非所有线程安全对象都是不可变的。

关于c# - "thread-safe type"到底是什么?我们什么时候需要使用 "lock"语句呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4069882/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com