当前位置: 首页 > 编程日记 > 正文

描述C#多线程中 lock关键字

  本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。

每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。

C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。在C# lock关键字定义如下:

lock(expression) statement_block

expression代表你希望跟踪的对象,通常是对象引用。

如果你想保护一个类的实例,一般地,你可以使用this;如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。

而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。

下面是一个使用C# lock关键字的典型例子,在注释里说明了C# lock关键字的用法和用途。

示例如下:

ExpandedBlockStart.gif代码
using System; 
using System.Threading; 
namespace ThreadSimple

    
internal class Account
    { 
        
int balance; //余额
        Random r=new Random(); 
        
internal Account(int initial)  
        {  
            balance
=initial; 
        }
        
internal int Withdraw(int amount) //取回、取款
        { 
            
if(balance<0
            {  
                
//如果balance小于0则抛出异常  
                throw new Exception("NegativeBalance");//负的 余额 
            } 
            
//下面的代码保证在当前线程修改balance的值完成之前 
            
//不会有其他线程也执行这段代码来修改balance的值  
            
//因此,balance的值是不可能小于0的  
            lock(this)  
            { 
                Console.WriteLine(
"CurrentThread:"+Thread.CurrentThread.Name); 
                
//如果没有lock关键字的保护,那么可能在执行完if的条件判断(成立)之后  
                
//另外一个线程却执行了balance=balance-amount修改了balance的值 
                
//而这个修改对这个线程是不可见的,所以可能导致这时if的条件已经不成立了 
                
//但是,这个线程却继续执行 balance=balance-amount,所以导致balance可能小于0 
                if(balance>=amount) 
                { 
                    Thread.Sleep(
5);
                    balance
=balance-amount; 
                    
return  amount; 
                }  
else 
                { 
                    
return 0;
                    
//transactionrejected 
                } 
            }  
        }
        
internal void DoTransactions()//取款事务
        {
            
for (int i = 0; i < 100; i++)
            {
                Withdraw(r.Next(
-50100));
            }
        }
    }   



    
internal class Test  
    {  
        
static internal Thread[] threads=new Thread[10]; 
        
public static void Main()  
        {  
            Account acc
=new Account(0); 
            
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].Name 
= i.ToString();
            }
            
for (int i = 0; i < 10; i++)
            {
                threads[i].Start();
                Console.ReadLine();
            }
        }
    } 

转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/12/27/1633508.html

相关文章:

从样本处理到决策模型,如何用NLP识别盗版资源?

作者 | 阿里文娱高级开发工程师千起出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;背景随着5G时代来临&#xff0c;新媒体行业快速发展&#xff0c;盗版传播平台多样化、形式多样化&#xff0c;版权方难以通过有限的人力实现最大限度的维权。根据MUSO报告显示2017年…

利用.htaccess绑定子域名到子目录(亲测万网可用)

http://www.xmgho.com/archives/783.html 利用.htaccess绑定域名到子目录,前提你的空间服务器必须支持apache的rewrite功能&#xff0c;只有这样才能使用.htaccess。如果你的空间是Linux服务器 一般默认都开启了的。绑定域名 登陆域名管理台&#xff08;如DNSPod&#xff09; 把…

Memcached内存池分析

针对Memcacged1.4.15代码 1.完整slabs内存池图 这是我画的memcached的slabs内存池对象关系图&#xff1a; 2.内存池数据结构 typedef struct {unsigned int size; /* 每个item的大小 */unsigned int perslab; /* 每个page中包含多少个item */void *slots; …

Google重磅发布开源库TFQ,快速建立量子机器学习模型

整理 | 弯月编辑 | 郭芮出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;近日&#xff0c;Google 与滑铁卢大学、大众汽车等联合发布 TensorFlow Quantum&#xff08;TFQ&#xff09;&#xff0c;一个可快速建立量子机器学习模型原型的开源库。TFQ提供了必…

.net3.5的安装与修复

<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />.net3.5的安装与修复.net3.5正常安装的顺序是先安装windows IIS组件&#xff0c;然后再安装.net3.5安装包&#xff0c;而.net3.5安装包的下载地址可以去百度和google上搜一下&…

jquery easy ui 简单字段选择搜索实现

写的比较粗糙&#xff0c;望见谅。 要实现的效果&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>jQuery EasyUI Application Demo</title><link rel"stylesheet" t…

训练数据也外包?这家公司“承包”了不少注释训练数据,原来是这样做的……...

作者 | Lionbridge AI译者 | 天道酬勤 责编 | 徐威龙封图| CSDN│下载于视觉中国出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;在机器学习领域&#xff0c;训练数据准备是最重要且最耗时的任务之一。实际上&#xff0c;许多数据科学家声称数据科学的很…

JavaScript Switch 语句

avaScript Switch 语句如果希望选择执行若干代码块中的一个&#xff0c;你可以使用 switch 语句&#xff1a;语法&#xff1a;switch(n){case 1:执行代码块 1breakcase 2:执行代码块 2breakdefault:如果n即不是1也不是2&#xff0c;则执行此代码}工作原理&#xff1a;switch 后…

参观Speedy Cloud 有感

上周老男孩的所有学生参观了Speedy Cloud &#xff0c;在这里我首先感谢Speedy Cloud的邀请和服务&#xff0c;我们每一个同学的收获都很大&#xff0c;不管是在以后的发展&#xff0c;还是现在的学习&#xff0c;都给了我很大的推动作用&#xff0c;帮助我去了解计算机的发展的…

C语言文件操作函数大全

unix中一切皆文件&#xff0c;所以文件操作至关重要&#xff01; clearerr&#xff08;清除文件流的错误旗标&#xff09; 相关函数 feof 表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * stream); 函数说明 clearerr&#xff08;&#xff09;清除参数stre…

Python进阶之递归函数的用法及其示例

作者 | 程序员adny责编 | 徐威龙封图| CSDN│下载于视觉中国出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;本篇文章主要介绍了Python进阶之递归函数的用法及其示例&#xff0c;现在分享给大家&#xff0c;也给大家做个参考。一起来看看吧。递归是指函数…

万科的千亿修炼

一位知名企业家说过&#xff0c;改革开放30年只是完成了市场经济的启蒙和启动&#xff0c;在未来的10至20年&#xff0c;中国将出现一批千亿级的企业。此次金融危机在为经济带来震荡的同时&#xff0c;也为我们提供了一个极佳的视角和机会&#xff0c;审视中国千亿企业的过去、…

nginx 开发一个简单的 HTTP 模块

2019独角兽企业重金招聘Python工程师标准>>> 1. 下载 Nginx http://nginx.org/ 2. 目录结构 $ tree -L 2 . ├── mytest_module │ ├── config │ └── ngx_http_mytest_module.c └── nginx ... 3. config # 在 configure 执行时使用 ngx_addon_nam…

Jquery 之Ajax方法$.get() 的运用,扩展链接模型的天地

如前文说道的那个表现层和业务层的链接模型&#xff0c;从上篇博文&#xff08;http://www.cnblogs.com/AflutterFeather/archive/2010/01/07/1641315.html&#xff09;中可以看到&#xff1a;我们通过WebService提供的方法来获取服务端的返回值。 如果不采用WebService&#…

B树建立与遍历

# include <stdio.h> # include <stdlib.h># include "btrees.h"/* 给一个结点分配空间 */ struct btnode * allocateNode(struct btnode *ptr){int i,max;ptr (struct btnode *)malloc(sizeof(struct btnode));if(!ptr){printf("allocated error!…

2.2版本发布!TensorFlow推出开发者技能证书

作者 | 弯月出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;受 COVID-19 的影响&#xff0c;今年的 TensorFlow 开发者大会于2020年3月12日&#xff08;北京时间&#xff09;凌晨以线上直播的方式与全球开发者见面。Google决定开源TensorFlow是为了让每个开发人员和研…

X3D中Profile如何翻译

问题在哪 在计算机术语中&#xff0c;Profile其实是很难用中文对应的词汇来翻译的一个单词。 在X3D国际标准中&#xff0c;就出现了Profile。它把软件产品对X3D的功能实现范围和相应支持程度做了预先的约定&#xff0c;分为Core Profile、Interchange Profile、Interactive Pro…

腾讯提结合ACNet进行细粒度分类,效果达到最新SOTA | CVPR 2020

作者 | VincentLee来源 | 晓飞的算法工程笔记细粒度分类(Fine-Grained Visual Categorization, FGVC)是图片分类的一个分支&#xff0c;由于类别间的相似性非常大&#xff0c;一般人比较难区分&#xff0c;所以是个很有研究意义的领域。受神经树研究的启发&#xff0c;论文设计…

asp.net mvc view中支持多个实体强类型小技巧

在MVC的开发过程中&#xff0c;在一个View里面可能需要调用多个对象&#xff0c;可是传统的方法是一次只能压入一个对象到View里面&#xff0c;这点并不像Castle框架的MVC好用&#xff0c;在Castle里面&#xff0c;可以很方便的把对象压入到前台Html里面&#xff0c;然后通过Ve…

使用指针做函数返回值

使用指针做函数返回值 1、当使用指针做为函数的返回值时&#xff0c;主函数处的char *p;将获得调用函数char *pf;的值&#xff0c;即一个地址值&#xff0c;如oxAE72。此时需要我们注意的是该地址值所指向的空间是否存在(即已向操作系统声明注册&#xff0c;不会被释放&#x…

Android Studio快捷键每日一练(2)

原文地址&#xff1a;http://www.developerphil.com/android-studio-tips-of-the-day-roundup-2/ 12、复制行 苹果&#xff1a;CmdD Windows&#xff1a;CtrlD 顾名思义&#xff0c;就是拷贝当前行并粘贴在下一行&#xff0c;整个过程无需和剪贴板交互。这个功能配合行移动快…

C语言字符char和整型int的关系

C语言并无char类型&#xff0c;就是用Int表示char的&#xff01;char占一个字节&#xff0c;在C语言所有类型中最小。 char *占4字节&#xff08;32位&#xff09;&#xff0c;8字节&#xff08;64位&#xff09; 在C语言中&#xff0c;实际上字符型数据在内存中是以二进制形式…

PyTorch关键算法疑似侵权,Facebook被起诉

作者 | 神经星星来源 | HyperAI超神经&#xff08;ID:HyperAI&#xff09;近期&#xff0c;一纸诉讼书引起社区的广泛讨论。该诉讼由创业公司 Neural Magic 发起&#xff0c;指控 Facebook 发布到 GitHub 的神经网络软件&#xff0c;使用了他们开发的核心算法。而泄露机密的人&…

大数据高效复制的处理案例分析总结

一个老客户提出这样的需求&#xff0c;希望将SQLServer中的某个表的数据快速复制到SQLite数据库里面以便进行定期的备份处理&#xff0c;数据表的记录大概有50多万条记录&#xff0c;表有100个字段左右&#xff0c;除了希望能够快速做好外&#xff0c;效率是第一位的&#xff0…

memset函数使用详解

1.void *memset(void *s,int c,size_t n) 总的作用&#xff1a;将已开辟内存空间 s 的首 n 个字节的值设为值 c。 2.例子 &#xff03;include void main(){ char *s"Golden Global View"; clrscr(); memset(s,G,6); printf("%s",s); getchar(); ret…

节后招人平均工资9000上热搜,为什么有些人去哪里都值钱?

我”荒“了。这是很多中国AI企业的现状。《人民日报》报道称&#xff0c;我国AI的人才缺口超过500万&#xff0c;供求比例仅为1&#xff1a;10&#xff01;很多企业已经开始面临“人才荒”的窘境&#xff0c;外媒爆料说&#xff0c;中国企业已经不断在硅谷挖人了&#xff01;目…

关于定于如何弄的漂亮点

</div></div><div class"panel"><h5 οnclickshowhidediv("sidebar_rss");>订阅博客</h5><div class"panel-content" id"sidebar_rss" style"display: block"><ul class"list&…

Happy New Year 2016

大学之前的时间都是按天来过的&#xff0c;期盼着一天一天地快快长大&#xff0c;期盼着过年穿新衣&#xff0c;阖家团聚&#xff0c;其乐融融&#xff1b; 大学的时间都是按周来过的&#xff0c;根据每周的课表周而复始&#xff0c;虽然单调但也是自由自在&#xff0c;简单充实…

HashTable原理与实现

memcached中hashtable部分的源码&#xff0c;hash部分的源码主要分布在assoc.h/c、hash.h/c中&#xff0c;总得来说代码比较简单&#xff0c;这里就稍微介绍一下。hashtable通常包括哈希函数和解决冲突的方法两个最主要的因素&#xff0c;memcached使用的哈希函数为Bob Jenkins…

as3自定义加载图片类

ImageLoader.as类&#xff1a; package{ import flash.display.Bitmap; import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.events.ProgressEvent; import flash.net.URLRequest; /** * 图片加载类…