Monitor、Lock使用示例

很久之前的面试就遇到过关于Monitor的一道笔试题,虽然很简单,但是由于我无知啊,基础差,又不上进,所以对很多东西的认识也很肤浅,就像之前人家形容的一部分人——只是工作经验丰富,会写一些代码,会用一些技术,但是却不知道为什么这么写,为什么这么用,这一部分人就包括我,大哭

下面是借用的别人的代码,只是想借用这个代码让自己以后回来翻看时能清楚一些:

using System.Threading;

public class Program
{
    static object ball = new object();

    public static void Main()
    {
        Thread threadPing = new Thread(ThreadPingProc);
        Thread threadPong = new Thread(ThreadPongProc);
        threadPing.Start(); 
        threadPong.Start();

        System.Console.ReadLine();
    }

    static void ThreadPongProc()
    {
        System.Console.WriteLine("ThreadPong: Hello!");
        lock (ball)
            for (int i = 0; i < 5; i++)
            {
                System.Console.WriteLine("ThreadPong: Pong ");
                Monitor.Pulse(ball);
                Monitor.Wait(ball);
            }
        System.Console.WriteLine("ThreadPong: Bye!");
    }

    static void ThreadPingProc()
    {
        System.Console.WriteLine("ThreadPing: Hello!");
        lock (ball)
            for (int i = 0; i < 5; i++)
            {
                System.Console.WriteLine("ThreadPing: Ping ");
                Monitor.Pulse(ball);
                Monitor.Wait(ball);
            }
        System.Console.WriteLine("ThreadPing: Bye!");
    }http://write.blog.csdn.net/postedit
}

上述三张图是上述代码执行多次的结果,可以看出threadPing和ThreadPong这两个线程并不是谁先Start就是谁先执行,而是由操作系统调度来决定的,

Monitor中有两个队列的概念:ready队列和waiting队列,如果线程A执行了Monitor.Wait(),那么ready队列中排第一的线程就会获得锁,同时线程A进入waiting队列的队尾,如果线程B执行了Monitor.Pulse(),那么waiting队列中排第一的线程就会进入ready队列,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Monitor 类和 lock 关键字都是用于线程同步的机制,用于防止多个线程访问共享资源时出现竞态条件等问题。 1. lock 关键字 lock 关键字在 C# 中是一种独占锁机制,用于确保在同一时刻只有一个线程可以访问被锁定的代码块。使用 lock 关键字的代码示例: ``` object lockObject = new object(); lock(lockObject) { // 要被锁定的代码块 } ``` 在上面的代码中,lockObject 是一个用于锁定的对象,只有获取到 lockObject 的锁的线程才能进入被锁定的代码块。如果其他线程尝试获取 lockObject 的锁,则会被阻塞,直到锁被释放。 2. MonitorMonitor 类也是一种独占锁机制,与 lock 关键字的作用类似。使用 Monitor 类的代码示例: ``` object lockObject = new object(); Monitor.Enter(lockObject); try { // 要被锁定的代码块 } finally { Monitor.Exit(lockObject); } ``` 在上面的代码中,使用 Monitor.Enter() 方法获取锁,使用 Monitor.Exit() 方法释放锁。与 lock 关键字不同的是,使用 Monitor 类还可以调用 Monitor.Wait() 方法和 Monitor.Pulse() 方法来实现线程的等待和唤醒,例如: ``` object lockObject = new object(); // 线程1 Monitor.Enter(lockObject); try { // 检查条件是否满足 while(!condition) { Monitor.Wait(lockObject); } // 条件满足,执行代码 } finally { Monitor.Exit(lockObject); } // 线程2 Monitor.Enter(lockObject); try { // 更改条件 condition = true; // 唤醒线程1 Monitor.Pulse(lockObject); } finally { Monitor.Exit(lockObject); } ``` 在上面的代码中,线程1在等待条件满足时调用 Monitor.Wait() 方法来释放锁并等待被唤醒,线程2在更改条件后调用 Monitor.Pulse() 方法来唤醒线程1。需要注意的是,调用 Monitor.Wait() 和 Monitor.Pulse() 方法时,需要获取锁并在 finally 块中释放锁,以确保锁的正确使用。 总之,lock 关键字和 Monitor 类都是用于线程同步的机制,可以根据具体的情况选择使用。在使用时,需要注意线程安全和锁的正确使用,避免出现死锁等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值