C# 面试题 目录

C# 中 Monitor 类的用法

推荐答案

-- -------------------- ---- -------
----- -------
----- -----------------

----- -------
-
    ------- ------ -------- ------ ----- - --- ---------
    ------- ------ --- --------------- - --

    ------ ---- ------------- -----
    -
        ------ ------- - --- --------------------------
        ------ ------- - --- --------------------------

        ----------------
        ----------------

        ---------------
        ---------------

        ------------------------- ----- -- ------ --------- --------------------
    -

    ------ ---- -------------------
    -
        --- ---- - - -- - - ----- ----
        -
            ---------------------
            ---
            -
                ------------------
            -
            -------
            -
                --------------------
            -
        -
    -
-

本题详细解读

Monitor 类的作用

Monitor 类是 C# 中用于实现线程同步的机制之一。它通过 EnterExit 方法来控制对共享资源的访问,确保在同一时间只有一个线程可以访问共享资源,从而避免竞态条件。

Monitor.Enter 和 Monitor.Exit

  • Monitor.Enter(object obj):尝试获取指定对象的独占锁。如果锁已被其他线程持有,当前线程将阻塞,直到锁被释放。
  • Monitor.Exit(object obj):释放指定对象的独占锁。通常与 Monitor.Enter 配对使用,确保锁在操作完成后被释放。

try-finally 块的使用

在使用 Monitor 时,通常将 Monitor.EnterMonitor.Exit 放在 try-finally 块中,以确保即使在发生异常的情况下,锁也能被正确释放,避免死锁。

示例代码解析

  • _lock 是一个用于同步的对象,所有线程在访问共享资源 _sharedResource 之前都必须先获取这个对象的锁。
  • IncrementResource 方法中,使用 Monitor.EnterMonitor.Exit 来确保对 _sharedResource 的访问是线程安全的。
  • 两个线程 thread1thread2 同时执行 IncrementResource 方法,但由于 Monitor 的同步机制,_sharedResource 的最终值将是 2000,而不是不确定的值。

注意事项

  • Monitor 是一个轻量级的同步机制,适用于简单的线程同步场景。对于更复杂的场景,可以考虑使用 MutexSemaphore
  • 使用 Monitor 时,必须确保 Monitor.Exit 被调用,否则会导致死锁。
纠错
反馈