Lock“锁定”语句(C# 参考)
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# 参考)相关推荐
- 摘录来自mysql 5.1的手册 关于mysql的事务处理和锁定语句
START TRANSACTION, COMMIT和ROLLBACK语法 START TRANSACTION | BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] ...
- mysql 隐式提交事务_MySQL的SQL语句 -事务性语句和锁定语句(2)- 致使隐式提交的语句...
致使隐式提交的语句html 本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就像在执行语句以前执行了 COMMIT 同样.mysql 大多数这些语句在执行后也会致使隐式提交. ...
- sql server(MsSql)字段命名,表命名,视图命名,SQL语句书写参考
@[TOC](sql server(MsSql)字段命名,表命名,视图命名,SQL语句书写参考) 对我个人来说,字段命名,表命名,视图命名,SQL语句书写都有一套自己的习惯,可以减少维护成本.减少不必 ...
- 14 事务控制和锁定语句
MySQL支持的锁定 : a.表级锁定 : MyISAM 和 MEMORY b.页级锁定 : BDB c.行级锁定 : InnoDB 默认情况下,表锁和行锁都是自动获得的,不需要额外命令. 有些情况下 ...
- mysql install语句_mysql8 参考手册--INSTALL COMPONENT语句
INSTALL COMPONENT component_name [, component_name ] ... 该语句安装一个或多个服务器组件,这些组件将立即变为活动状态.组件提供服务器和其他组件可 ...
- SQL 语句快速参考
语句 语法 AND / OR SELECT column_name(s) FROM table_name WHERE condition AND|OR condition ALTER TABLE (a ...
- mysql添加枚举约束语句_mysql8 参考手册--MySQL如何处理约束
MySQL使您既可以使用允许回滚的事务表,也可以使用不允许回滚的非事务表.因此,MySQL中的约束处理与其他DBMS中的约束处理有所不同.当您在非事务处理表中插入或更新了很多行时,如果发生错误,则无法 ...
- mysql事务控制(xa分布式事务)和锁定语句_MySQL的SQL语句 -事务性语句和锁定语句(7)- XA 事务...
XA 事务 InnoDB 存储引擎支持 XA 事务.MySQL XA 的实现基于 X/Open CAE 文档 Distributed Transaction Processing: The XA Sp ...
- varlimo阿米洛机械键盘 win lock锁定
我的型号是va87m. 看了淘宝商品详情界面发现有这个功能, Fn+左win键按长达3秒以上可以互换键的功能. 但是我不知道此时Fn键是就是Fn还是是左win键, 还有该键盘有个呼吸灯的功能, 快捷键 ...
最新文章
- 独热编码(one-hot)是什么?什么数据类型需要进行独热编码?pandas如何进行独热编码(one-hot)?
- python读取文件一行-Python逐行读取文件内容
- struts2教程(10)
- mysql限制类别_MySQL限制每个类别的结果
- 神雕侠侣2服务器维护,《神雕侠侣2》手游10月22日停服维护公告
- 前端学习(713)创建数组
- python两列数据生成邻接矩阵_用python实现邻接矩阵转换为邻接表,python语言实现...
- node.js 实现扫码二维码登录
- linux rhel5.6 使用163yum源
- Iterator(迭代器)-对象行为型模式
- smart-link原理
- 「leetcode」51. N皇后【回溯算法】详细图解!
- 如何使用电脑扫描二维码
- react 中加载静态word文档(或加载静态的html文件)
- Java 代码访问 SMB 协议
- Windows使用cwRsync实现服务器文件同步到Linux服务器
- Redis持久化策略AOF、RDB详解及源码分析
- Unity 2D打地鼠小游戏
- OSG智能指针---Referenced类
- Kubernetes之Service
热门文章
- 张洁的新书「流浪的老狗」
- 安卓SlidingDrawer
- 线性序列机与串行接口ADC驱动设计与验证
- 大一计算机上机试题2017,2017历年全国计算机二级ACCESS上机试题及答案
- nginx location 正则表达式匹配多个地址_就是要让你搞懂Nginx,这篇就够了!
- libnss mysql_Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式)
- 李宏毅机器学习课程12~~~半监督学习
- Kaggle : Using a Convolutional Neural Network for classifying Cats vs Dogs
- 深度学习系统相比较传统的机器学习系统,针对常见的分类问题,精度究竟能有多大提升?...
- 201904快速阅读术