c#语法之lock 语句
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 语句相关推荐
- 推荐的版本 lock 语句(C# 参考)
最近在研究.NET分布式缓存代码,正好涉及Lock,看了网上的文章,总结了一些Lock相关的知识,供大家一起学习参考. 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被其 ...
- sql高级语法之case语句
sql高级语法之case语句 1.创建数据库 2.创建表 3.CASE语句 语法格式1 示例 语法格式2 示例 1.创建数据库 create DATABASE advanced_prac; use a ...
- 为什么不能在lock语句的主体内使用#39;await#39;运算符?
本文翻译自:Why can't I use the 'await' operator within the body of a lock statement? The await keyword in ...
- oracle sql循环判断语句怎么写,Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理...
PL/SQL入门教程目录 Oracle PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理 一.PL/SQL简介 1.PL/SQL简介 1.PL/SQl是过程语言PL与结构化语言 ...
- python词汇和语法规定_Python语法规则与语句
语法规则与语句 一.输入与输出 输出: 1.输出单个值,将需要输出的内容直接放到小括号内即可,可以是任意类型的常量或者表达式. 2.输出多个值,将需要输出的内容放到小括号里,不同的输出内容用逗号隔开. ...
- 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. ...
- JAVA语法中case语句的特性
JAVA语法中case语句的特性: 1.case拥有穿透机制, 若case后不写break,如果命中了某个case语句步骤,下面的case结果将会同时执行.建议写完一个case后 针对break的增加 ...
- JavaScript基础语法(输出语句)
JavaScript基础语法(输出语句) 学习路线:JavaScript基础语法(输出语句)->JavaScript基础语法(变量)->JavaScript基础语法(数据类型)->J ...
- lock语句和线程安全
--------------以下部分内容摘自<C#高级编程(第八版)>--------------- 先来看一个简单的Demo: 首先是两个类的定义 Student类,只有一个简单的Num ...
最新文章
- 51NOD 1287 加农炮(不水的线段树)
- ESP32-S的UART2的初始化需要注意的问题
- php团队规范,简单的PHP团队编程规范与习惯
- 实战SSM_O2O商铺_40【前端展示】首页轮播图和一级商铺View层的实现
- Lockey的沙雕低错集锦(未完待续~自己提升用)
- 极大似然估计(Maximum Likelihood)与无监督
- java 线程池技术_Java线程池技术以及实现
- 作业30-首页列表显示全部问答,完成问答详情页布局
- pku773_Happy 2006
- 7-13 日K蜡烛图
- thinkphp redis队列处理_教你用ThinkPHP中thinkphpqueue
- GStreamer入门概念(二)
- 拓端tecdat|R语言使用马尔可夫链Markov Chain, MC来模拟抵押违约
- USB-HDD/ZIP/HDD+/ZIP+/CDROM(量产) U盘启动模式简介
- 谢晶:webpower中国区正在向“多渠道智能化营销”全面转型
- ORACLE 的 ADD_MONTHS函数常用来计算 上年同期
- dw添加下拉菜单_用dreamweaver制作网站下拉菜单的实现教程
- VR与360环物实现详细过程
- 苹果iPhone手机如何安装Tiktok?最新IOS苹果TikTok抖音国际版下载免拔卡安装使用教程
- lect01_codes02_numpy
热门文章
- python小黄人程序_python signal信号
- 静态分配内存和动态分配内存
- 贪心/栈 - 去除重复字母
- muduo学习笔记 - 第1章 C++多线程系统编程
- 修复kali grub引导
- linux终端刷新网络命令,在Ubuntu Linux操作系统中重新启动网络的方法
- java加载xml配置文件_java读取配置文件的几种方法
- 概率论-3.4 多维随机变量的特征数
- 沙老师的作业系列——Crackme3
- [BUUCTF-pwn]——pwn1_sctf_2016