zoukankan      html  css  js  c++  java
  • C# 关于线程锁lock的使用方法

    C# 关于线程锁lock的使用方法

    原创 2016年09月02日 10:07:05

            在多线程编程中,可能会有许多线程并发的执行一段代码(代码块A),以提高执行效率。在某些情况下,我们希望A中的代码块(B)同步的执行,即同一时刻只有一个线程执行代码块B,这就需要用到锁(lock)。lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。

    其写法如下:

    Object  locker = new Object();

    lock(locker)

    {

          B    //同步执行的代码

    }

    其相当于如下代码:

    //System.Threading.Moniter.enter(Object),Moniter类提供同步访问对象的机制,enter方法在指定对象上获取排他锁,之后其他线程不能再次获取,直到释放

    Monitor.enter(locker); 
    {
          B
    }
    Monitor.exit(locker); //exit(Object)释放指定对象上的排他锁。

    lock 语句的表达式必须表示一个引用类型的值。永远不会为 lock 语句中的表达式执行隐式装箱转换,因此,如果该表达式表示的是一个值类型的值,则会导致一个编译时错误。

    C#中引用类型主要有:数组、类、接口、委托、object、字符串,但是最好不要锁字符串;使用lock同步时,应保证lock的是同一个对象,而给字符串变量赋值并不是修改它,而是重新创建了新的对象,这样多个线程以及每个循环之间所lock的对象都不同,因此达不到同步的效果。常用做法是创建一个object对象,并且永不赋值。

    下面举个简单的例子,一群苦逼程序员被逼捐款,每人100:

  • 相关阅读:
    基础算法:两数之和
    adb常用命令食用方法
    C语言面试题
    C语言经典笔试题目
    嵌入式01 51单片机实验02 sfr和sbit bit和int char
    C语言 01 volatile关键字
    C++ 01 基础知识点
    嵌入式02 STM32 实验11 NVIC和中断总结
    嵌入式02 STM32 实验10 定时器中断
    嵌入式02 STM32 实验09 独立/窗口看门狗
  • 原文地址:https://www.cnblogs.com/zhoading/p/8513972.html
Copyright © 2011-2022 走看看