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

以带有颜色区分的格式查看复制到剪贴板打印
Object thisLock = new Object();
lock (thisLock)
{// Critical code section.}

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

备注

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

线程处理(C# 和 Visual Basic) 这节讨论了线程处理。

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

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

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

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

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

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

示例

下面演示在 C# 中使用未锁定的线程的简单示例。

    //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();}}// Output: RunMe called

    //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();}}// Output: RunMe called

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

    // 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/kingangWang/archive/2011/12/05/2276815.html

Lock“锁定”语句(C# 参考)相关推荐

  1. 摘录来自mysql 5.1的手册 关于mysql的事务处理和锁定语句

    START TRANSACTION, COMMIT和ROLLBACK语法 START TRANSACTION | BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] ...

  2. mysql 隐式提交事务_MySQL的SQL语句 -事务性语句和锁定语句(2)- 致使隐式提交的语句...

    致使隐式提交的语句html 本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就像在执行语句以前执行了 COMMIT 同样.mysql 大多数这些语句在执行后也会致使隐式提交. ...

  3. sql server(MsSql)字段命名,表命名,视图命名,SQL语句书写参考

    @[TOC](sql server(MsSql)字段命名,表命名,视图命名,SQL语句书写参考) 对我个人来说,字段命名,表命名,视图命名,SQL语句书写都有一套自己的习惯,可以减少维护成本.减少不必 ...

  4. 14 事务控制和锁定语句

    MySQL支持的锁定 : a.表级锁定 : MyISAM 和 MEMORY b.页级锁定 : BDB c.行级锁定 : InnoDB 默认情况下,表锁和行锁都是自动获得的,不需要额外命令. 有些情况下 ...

  5. mysql install语句_mysql8 参考手册--INSTALL COMPONENT语句

    INSTALL COMPONENT component_name [, component_name ] ... 该语句安装一个或多个服务器组件,这些组件将立即变为活动状态.组件提供服务器和其他组件可 ...

  6. SQL 语句快速参考

    语句 语法 AND / OR SELECT column_name(s) FROM table_name WHERE condition AND|OR condition ALTER TABLE (a ...

  7. mysql添加枚举约束语句_mysql8 参考手册--MySQL如何处理约束

    MySQL使您既可以使用允许回滚的事务表,也可以使用不允许回滚的非事务表.因此,MySQL中的约束处理与其他DBMS中的约束处理有所不同.当您在非事务处理表中插入或更新了很多行时,如果发生错误,则无法 ...

  8. mysql事务控制(xa分布式事务)和锁定语句_MySQL的SQL语句 -事务性语句和锁定语句(7)- XA 事务...

    XA 事务 InnoDB 存储引擎支持 XA 事务.MySQL XA 的实现基于 X/Open CAE 文档 Distributed Transaction Processing: The XA Sp ...

  9. varlimo阿米洛机械键盘 win lock锁定

    我的型号是va87m. 看了淘宝商品详情界面发现有这个功能, Fn+左win键按长达3秒以上可以互换键的功能. 但是我不知道此时Fn键是就是Fn还是是左win键, 还有该键盘有个呼吸灯的功能, 快捷键 ...

最新文章

  1. 独热编码(one-hot)是什么?什么数据类型需要进行独热编码?pandas如何进行独热编码(one-hot)?
  2. python读取文件一行-Python逐行读取文件内容
  3. struts2教程(10)
  4. mysql限制类别_MySQL限制每个类别的结果
  5. 神雕侠侣2服务器维护,《神雕侠侣2》手游10月22日停服维护公告
  6. 前端学习(713)创建数组
  7. python两列数据生成邻接矩阵_用python实现邻接矩阵转换为邻接表,python语言实现...
  8. node.js 实现扫码二维码登录
  9. linux rhel5.6 使用163yum源
  10. Iterator(迭代器)-对象行为型模式
  11. smart-link原理
  12. 「leetcode」51. N皇后【回溯算法】详细图解!
  13. 如何使用电脑扫描二维码
  14. react 中加载静态word文档(或加载静态的html文件)
  15. Java 代码访问 SMB 协议
  16. Windows使用cwRsync实现服务器文件同步到Linux服务器
  17. Redis持久化策略AOF、RDB详解及源码分析
  18. Unity 2D打地鼠小游戏
  19. OSG智能指针---Referenced类
  20. Kubernetes之Service

热门文章

  1. 张洁的新书「流浪的老狗」
  2. 安卓SlidingDrawer
  3. 线性序列机与串行接口ADC驱动设计与验证
  4. 大一计算机上机试题2017,2017历年全国计算机二级ACCESS上机试题及答案
  5. nginx location 正则表达式匹配多个地址_就是要让你搞懂Nginx,这篇就够了!
  6. libnss mysql_Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式)
  7. 李宏毅机器学习课程12~~~半监督学习
  8. Kaggle : Using a Convolutional Neural Network for classifying Cats vs Dogs
  9. 深度学习系统相比较传统的机器学习系统,针对常见的分类问题,精度究竟能有多大提升?...
  10. 201904快速阅读术