• .Net 【基础回顾】锁 Monitor/lock


    摘要

    锁是处理多线程时经常会用到的,是把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。

    Monitor

    常用属性和方法:

    • Enter(Object) 在指定对象上获取排他锁。

    • Exit(Object) 释放指定对象上的排他锁。

    • IsEntered 确定当前线程是否保留指定对象锁。

    • Pulse 通知等待队列中的线程锁定对象状态的更改。

    • PulseAll 通知所有的等待线程对象状态的更改。

    • TryEnter(Object) 试图获取指定对象的排他锁。

    • TryEnter(Object, Boolean) 尝试获取指定对象上的排他锁,并自动设置一个值,指示是否得到了该锁。

    • Wait(Object) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。

    Lock

    Lock关键字实际上是一个语法糖,它将Monitor对象进行封装,给object加上一个互斥锁

    private static object obj = new object();
    
    try
    {
        Monitor.Enter(obj);
        dosomething();
    }
    catch (Exception ex)
    {
    
    }
    finally
    {
        Monitor.Exit(obj);
    }
    

    相当于

    
    lock (obj)
    {
        dosomething();
    }
    			
    

    注意点

    • 不能在lock中等待
    public async Task Do()
    {
        lock (this)
        {
            await DoTask();
        }
    }
    
    

    会有错误提醒无法在 lock 语句体中等待

    不过使用monitor的话是不会有报错提醒的,但是还是有问题,使用时注意

  • 相关阅读:
    关于C语言字符串
    进程间通信方式总结
    数据结构(3)-----链表
    Oracle查看用户所在表空间
    oracle linux了解基本命令行
    关于分区技术的索引 index
    oracle闪回表详解
    转:深入学习Oracle分区表及分区索引
    第一章 基本的SQL语句 (SQL基础)
    linux根分区扩容
  • 原文地址:https://www.cnblogs.com/thomerson/p/16410964.html
Copyright © 2020-2023  润新知