lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下:

Object thisLock = new Object();
lock (thisLock)
{
    // Critical code section.
}

lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。

通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:

  • 如果实例可以被公共访问,将出现 lock (this) 问题。

  • 如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。

  • 由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock(“myLock”) 问题。

最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。

下例显示的是在 C# 中使用线程的简单示例。

// statements_lock.cs
using System;
using System.Threading;
 
class ThreadTest
{
    public void RunMe()
    {
        Console.WriteLine("RunMe called");
    }
 
    static void Main()
    {
        ThreadTest b = new ThreadTest();
        Thread t = new Thread(b.RunMe);
        t.Start();
    }
}

结果为:

RunMe called

下例使用线程和 lock。只要 lock 语句存在,语句块就是临界区并且 balance 永远不会是负数。

// statements_lock2.cs
using System;
using System.Threading;
 
class Account
{
    private Object thisLock = new Object();
    int balance;
 
    Random r = new Random();
 
    public Account(int initial)
    {
        balance = initial;
    }
 
    int Withdraw(int amount)
    {
 
        // This condition will never be true unless the lock statement
        // is commented out:
        if (balance < 0)
        {
            throw new Exception("Negative Balance");
        }
 
        // Comment out the next line to see the effect of leaving out 
        // the lock keyword:
        lock(thisLock)
        {
            if (balance >= amount)
            {
                Console.WriteLine("Balance before Withdrawal :  " + balance);
                Console.WriteLine("Amount to Withdraw        : -" + amount);
                balance = balance - amount;
                Console.WriteLine("Balance after Withdrawal  :  " + balance);
                return amount;
            }
            else
            {
                return 0; // transaction rejected
            }
        }
    }
 
    public void DoTransactions()
    {
        for (int i = 0; i < 100; i++)
        {
            Withdraw(r.Next(1, 100));
        }
    }
}
 
class Test
{
    static void Main()
    {
        Thread[] threads = new Thread[10];
        Account acc = new Account(1000);
        for (int i = 0; i < 10; i++)
        {
            Thread t = new Thread(new ThreadStart(acc.DoTransactions));
            threads[i] = t;
        }
        for (int i = 0; i < 10; i++)
        {
            threads[i].Start();
        }
    }
}

转载于:https://www.cnblogs.com/superfang/archive/2008/06/29/1232164.html

c#语法之lock 语句相关推荐

  1. 推荐的版本 lock 语句(C# 参考)

    最近在研究.NET分布式缓存代码,正好涉及Lock,看了网上的文章,总结了一些Lock相关的知识,供大家一起学习参考. 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其 ...

  2. sql高级语法之case语句

    sql高级语法之case语句 1.创建数据库 2.创建表 3.CASE语句 语法格式1 示例 语法格式2 示例 1.创建数据库 create DATABASE advanced_prac; use a ...

  3. 为什么不能在lock语句的主体内使用#39;await#39;运算符?

    本文翻译自:Why can't I use the 'await' operator within the body of a lock statement? The await keyword in ...

  4. oracle sql循环判断语句怎么写,Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理...

    PL/SQL入门教程目录 Oracle PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理 一.PL/SQL简介 1.PL/SQL简介 1.PL/SQl是过程语言PL与结构化语言 ...

  5. python词汇和语法规定_Python语法规则与语句

    语法规则与语句 一.输入与输出 输出: 1.输出单个值,将需要输出的内容直接放到小括号内即可,可以是任意类型的常量或者表达式. 2.输出多个值,将需要输出的内容放到小括号里,不同的输出内容用逗号隔开. ...

  6. SQL笔记(一)SQL语法、SELECT语句、DISTINCT语句、LIMIT、LIMIT和OFFSET组合使用、WHERE 子句

    文章目录 1SQL语法 1.1 SELECT 语句 1.1.1SQL SELECT 语句 1.1.2SQL SELECT 语法 1.2DISTINCT 语句 1.2.1 DISTINCT 的作用 1. ...

  7. JAVA语法中case语句的特性

    JAVA语法中case语句的特性: 1.case拥有穿透机制, 若case后不写break,如果命中了某个case语句步骤,下面的case结果将会同时执行.建议写完一个case后 针对break的增加 ...

  8. JavaScript基础语法(输出语句)

    JavaScript基础语法(输出语句) 学习路线:JavaScript基础语法(输出语句)->JavaScript基础语法(变量)->JavaScript基础语法(数据类型)->J ...

  9. lock语句和线程安全

    --------------以下部分内容摘自<C#高级编程(第八版)>--------------- 先来看一个简单的Demo: 首先是两个类的定义 Student类,只有一个简单的Num ...

最新文章

  1. 51NOD 1287 加农炮(不水的线段树)
  2. ESP32-S的UART2的初始化需要注意的问题
  3. php团队规范,简单的PHP团队编程规范与习惯
  4. 实战SSM_O2O商铺_40【前端展示】首页轮播图和一级商铺View层的实现
  5. Lockey的沙雕低错集锦(未完待续~自己提升用)
  6. 极大似然估计(Maximum Likelihood)与无监督
  7. java 线程池技术_Java线程池技术以及实现
  8. 作业30-首页列表显示全部问答,完成问答详情页布局
  9. pku773_Happy 2006
  10. 7-13 日K蜡烛图
  11. thinkphp redis队列处理_教你用ThinkPHP中thinkphpqueue
  12. GStreamer入门概念(二)
  13. 拓端tecdat|R语言使用马尔可夫链Markov Chain, MC来模拟抵押违约
  14. USB-HDD/ZIP/HDD+/ZIP+/CDROM(量产) U盘启动模式简介
  15. 谢晶:webpower中国区正在向“多渠道智能化营销”全面转型
  16. ORACLE 的 ADD_MONTHS函数常用来计算 上年同期
  17. dw添加下拉菜单_用dreamweaver制作网站下拉菜单的实现教程
  18. VR与360环物实现详细过程
  19. 苹果iPhone手机如何安装Tiktok?最新IOS苹果TikTok抖音国际版下载免拔卡安装使用教程
  20. lect01_codes02_numpy

热门文章

  1. python小黄人程序_python signal信号
  2. 静态分配内存和动态分配内存
  3. 贪心/栈 - 去除重复字母
  4. muduo学习笔记 - 第1章 C++多线程系统编程
  5. 修复kali grub引导
  6. linux终端刷新网络命令,在Ubuntu Linux操作系统中重新启动网络的方法
  7. java加载xml配置文件_java读取配置文件的几种方法
  8. 概率论-3.4 多维随机变量的特征数
  9. 沙老师的作业系列——Crackme3
  10. [BUUCTF-pwn]——pwn1_sctf_2016