C#线程中LOCK的意义
学习心得,为的是让新人能理解,高手直接绕~
lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
引用一句看到的资料里比较流行的话“前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。”
建一个控制台应用程序
首先引用这个.....
using System.Threading;
class ThreadInterrupt
{
static void Main()
{
test tt = new test();
///写这么多个为的是让环境更加容易创造出氛围来,线程多起来,出问题的可能性就大
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start();
new Thread(new ThreadStart(tt.test1)).Start(); }
class test
{
private int a;
private object b;
public test()
{
a = ;
b = new object();
} public void test1()
{ //////在该位置加lock(this){ ///没有lock的情况下,所有线程都会实时进入(线程是无序的)
Console.WriteLine("the thread:{0} 进入 ...", Thread.CurrentThread.GetHashCode());
/////然后每个线程都会去判断a的值
if (a == )
{
Console.WriteLine("a={0},b={1},当前进程{2}", a, b, Thread.CurrentThread.GetHashCode());
return;
}
///到此,如果线程哈希值不是4,则休眠一秒钟,为的是让晚于线程4但是已经判断a!=0的线程再次停留,给线程4充分的事件去把a置为0
if (Thread.CurrentThread.GetHashCode() != )
{
Thread.Sleep();
}
/////用当前线程的哈希值除a,为的是如果a为0的话能出现异常,当然可以随便写 110/a,907867869/a都可以
b = (Thread.CurrentThread.GetHashCode() / a).ToString();
///每个线程进入时对a做一些改变,无关紧要的
a -= Thread.CurrentThread.GetHashCode();
///如果线程哈希值是4,则将a置为0。
if (Thread.CurrentThread.GetHashCode() == )
{
a = ;
} Console.WriteLine("a={0},b={1},当前进程{2}", a, b, Thread.CurrentThread.GetHashCode()); //////lock的 "}"
} } }
C#线程中LOCK的意义的更多相关文章
- 一个线程中lock用法的经典实例
/* 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 作者:http://h ...
- 理解C#的Lock语法意义
一. 为什么要lock,lock了什么? 当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当 ...
- c#初学-多线程中lock用法的经典实例
本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被 ...
- 多线程中lock用法的经典实例
多线程中lock用法的经典实例 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一 ...
- 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯
1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...
- Python进阶(3)_进程与线程中的lock(线程中互斥锁、递归锁、信号量、Event对象、队列queue)
1.同步锁 (Lock) 当全局资源(counter)被抢占的情况,问题产生的原因就是没有控制多个线程对同一资源的访问,对数据造成破坏,使得线程运行的结果不可预期.这种现象称为“线程不安全”.在开发过 ...
- C#中的线程(中)-线程同步
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...
- .NET中lock的使用方法及注意事项
lock就是把一段代码定义为临界区,所谓临界区就是同一时刻只能有一个线程来操作临界区的代码,当一个线程位于代码的临界区时,另一个线程不能进入临界区,如果试图进入临界区,则只能一直等待(即被阻止),直到 ...
- Python并发编程之谈谈线程中的“锁机制”(三)
大家好,并发编程 进入第三篇. 今天我们来讲讲,线程里的锁机制. 本文目录 何为Lock( 锁 )?如何使用Lock( 锁 )?为何要使用锁?可重入锁(RLock)防止死锁的加锁机制饱受争议的GIL( ...
随机推荐
- class文件访问标志
class文件中用两个字节共16位代表访问标志(access flags),用于表明该类或接口被访问时能提供的一些信息: 标志名称 标志值 含义 ACC_PUBLIC 0x00 01 是否为Publi ...
- PTA --- 天梯赛 L1-064 估值一亿的AI核心代码
L1-064 估值一亿的AI核心代码 (20 point(s)) 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多 ...
- Django模板系统-标签Tags
for <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul ...
- java位运算定义常量
简单说一下位运算 按位与(&) 参加运算的两个数,换算为二进制(0.1)后,进行与运算.只有当相应位上的数都是1时,该位才取1,否则该为为0 按位或(|) 参加运算的两个数,换算为二进制(0. ...
- 【DSP开发】TMS320C66x DSP SPI Nor Flash的程序烧写
经过一段时间的研究终于把TMS320C6657单核和双核的SPI Nor Flash的程序烧写调通了.工具都是前辈的工作,有需要的可以留下邮箱,我有空可以发. 原理参考钱丰的<TI c66x 系 ...
- C++学习笔记-多态的实现原理
深入了解多态的实现原理,有助于提高对于多态的认识 多态基础 多态的实现效果 多态:同样的调用语句有多种不同的表现形态 多态实现的三个条件 有继承.有virtual重写.有父类指针(引用)指向子类对象 ...
- flask_script
Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任 ...
- pikachu-SQL注入
参考网址: http://www.mamicode.com/info-detail-2795438.html
- 2019牛客暑期多校训练营(第一场)-A (单调栈)
题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...
- [转帖]【JDK和Open JDK】平常使用的JDK和Open JDK有什么区别
https://www.cnblogs.com/sxdcgaq8080/p/7487369.html 其实不同的 openjdk的版本也不一样. atlassian说AdoptOpenJDK我们测试充 ...