Lock 类

定义

提供一种机制,用于在不同线程之间的代码区域中实现相互排斥。

public ref class Lock sealed
public sealed class Lock
type Lock = class
Public NotInheritable Class Lock
继承
Lock

注解

Lock 类可用于定义需要在进程线程(通常称为关键节)之间相互排斥访问的代码区域,以防止对资源的并发访问。 可以进入和退出 A Lock ,其中进入和退出之间的代码区域是与锁关联的关键部分。 进入锁的线程据说持有或拥有锁,直到它退出锁。 最多一个线程可以在任何给定时间持有锁。 线程可以保留多个锁。 线程可以在退出之前多次输入锁,例如递归。 无法立即输入锁的线程可以等待,直到输入锁或指定的超时过期为止。

使用 EnterTryEnter 方法输入锁时:

  • 确保线程即使出现异常(如 C# 中)也退出锁定 Exit ,例如使用块在 C# 中 try/finally
  • 在 C# async 方法中输入和退出锁时,请确保进入和退出之间不存在 await 。 锁由线程持有,以下 await 代码可能在不同的线程上运行。

建议将 EnterScope 该方法与自动释放返回 Lock.Scope 的语言构造(如 C# 关键字)或使用 C# usinglock 关键字一起使用,因为这些方法可确保在特殊情况下退出锁。 这些模式在使用和Exit方面Enter/TryEnter也可能具有性能优势。 以下代码片段演示了用于进入和退出锁的各种模式。

public sealed class ExampleDataStructure
{
    private readonly Lock _lockObj = new();

    public void Modify()
    {
        lock (_lockObj)
        {
            // Critical section associated with _lockObj
        }

        using (_lockObj.EnterScope())
        {
            // Critical section associated with _lockObj
        }

        _lockObj.Enter();
        try
        {
            // Critical section associated with _lockObj
        }
        finally { _lockObj.Exit(); }

        if (_lockObj.TryEnter())
        {
            try
            {
                // Critical section associated with _lockObj
            }
            finally { _lockObj.Exit(); }
        }
    }
}

使用 C# lock 关键字或类似的输入和退出锁时,表达式的类型必须精确 System.Threading.Lock。 如果表达式的类型是其他任何内容(如 Object 或泛型类型), T则可以改用不可互换的其他实现(例如 Monitor)。 有关详细信息,请参阅相关的 编译器规范

Interrupt 可以中断等待输入锁的线程。 在 Windows STA 线程上,等待锁允许消息泵送,这些消息可以在等待期间在同一线程上运行其他代码。 某些等待功能可由自定义 SynchronizationContext重写。

Note

进入锁的线程(包括递归的多次)必须退出锁的次数相同,才能完全退出锁并允许其他线程进入锁。 如果线程在持有某个 Lock线程时退出,则其 Lock 行为将变为未定义。

注意

如果在代码路径上,线程可能会在退出之前输入多个锁,请确保在同一线程上输入其中任意两个锁的所有代码路径都按相同顺序输入它们。 否则,可能会导致死锁。 例如,假设在一个代码路径线程 T1 进入锁 L1 ,然后在 L2 退出前锁定,另一个代码路径线程 T2 按逆序输入这两个锁。 在这种情况下,可以按以下顺序发生事件:T1输入、T2输入L1L2T1尝试输入L2和等待、T2尝试输入L1和等待。 两者之间T1T2存在死锁,无法解析,尝试在将来输入任一锁的任何其他线程也会挂起。

构造函数

名称 说明
Lock()

初始化 Lock 类的新实例。

属性

名称 说明
IsHeldByCurrentThread

获取一个值,该值指示锁是否由当前线程持有。

方法

名称 说明
Enter()

输入锁,如有必要,请等待,直到可以输入锁。

EnterScope()

输入锁,如有必要,请等待,直到可以输入锁。

Equals(Object)

确定指定对象是否等于当前对象。

(继承自 Object)
Exit()

退出锁。

GetHashCode()

用作默认哈希函数。

(继承自 Object)
GetType()

获取当前实例的 Type

(继承自 Object)
MemberwiseClone()

创建当前 Object的浅表副本。

(继承自 Object)
ToString()

返回一个表示当前对象的字符串。

(继承自 Object)
TryEnter()

尝试在不等待的情况下输入锁。

TryEnter(Int32)

尝试输入锁,如有必要,等待指定的毫秒数,直到可以输入锁。

TryEnter(TimeSpan)

尝试输入锁,根据需要等待,直到可以输入锁,或直到指定的超时到期。

适用于