lock与C#多线程
lock与C#多线程
lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。简单讲就类似于 你去银行办理业务,一个柜台一次只能操作以为客户,而如果你要到这个柜台办理业务就必须等前面的人的业务完成,而彼此之间不会有交集。下面通过具体的代码来深入说明:
using System;
using System.Threading; namespace LockTest
{
class Program
{
static void Main()
{
Test test = new Test(); Thread one = new Thread(test.ThreadOne); //线程一调用test的 ThreadOne 方法
Thread two = new Thread(test.ThreadTwo); //线程而调用test的 ThreadTwo 方法
one.Start(); //启动线程一
two.Start(); //启动线程二
Console.ReadKey();
}
} class LockTest
{
public int Number { get; set; } = ; public void Print()
{
Console.WriteLine("The number is " + Number);
}
} class Test
{
private readonly LockTest _lockTest = new LockTest(); //用于测试的对象 public void ThreadOne()
{
//在此方法内锁定 _lockTest 所引用的对象并执行相应操作,在操作执行完以前不会释放次对象
lock (_lockTest)
{
Console.WriteLine("The object has been locked!");
Thread.Sleep(); //让当前线程休眠 5s
_lockTest.Number = ;
Console.Write("ThreadOne: ");
_lockTest.Print();
}
//操作完成并释放对象
Console.WriteLine("The object has been released!");
} public void ThreadTwo()
{
//Console.WriteLine(_lockTest.Number);
_lockTest.Number = ;
//Console.WriteLine(_lockTest.Number);
//锁定 _lockTest 所引用的对象
//如果要保证 lock 正常工作,所有对 _lockTest 的操作都要使用 lock 锁定
//比如上面 _lockTest.Number=100; 在 lock 外面,那么它将不受约束(即可以强制访问 _lockTest)
//如果在上面语句后加 Console.WriteLine(_lockTest.Number); 那么将输出 100 而不是 200 (也不是 10)
lock (_lockTest)
{
//_lockTest.Number=100;
Console.Write("ThreadTwo: ");
_lockTest.Print();
}
}
}
}
运行上面的代码会发现在ThreadTwo 方法里的 lock内的代码 时有明显的延迟,即必须等到ThreadOne运行完成了才继续执行 lock内部的代码,而且输出的结果是200而不是100,说明 lock 外面的代码不会发生任何延迟。如果把 _lockTest.Number=100; 语句放在lock内部,会发现结果变成了 100 。
通过上面的例子可以看出要保证 lock 正确工作,要对每个 _lockTest 的操作加上 lock锁定 。而在程序运行的时候,会根据线程访问次对象的先后顺序来为每个线程排序,且只有排在前面的线程对对象的操作完成了后面的对象才能访问此对象。
lock与C#多线程的更多相关文章
- Python3 GIL(Global Interpreter Lock)与多线程
GIL(Global Interpreter Lock)与多线程 GIL介绍 GIL与Lock GIL与多线程 多线程性能测试 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线 ...
- 多线程-lock锁
package 多线程.lock锁; import java.util.concurrent.locks.ReentrantLock; /*. * * //同步代码块 * * */ public cl ...
- 编写高质量代码:改善Java程序的151个建议(第8章:多线程和并发___建议126~128)
建议126:适时选择不同的线程池来实现 Java的线程池实现从根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系 ...
- c++并发练习---多线程顺序打印
参考:http://blog.csdn.net/liuxuejiang158blog/article/details/22061267 题目:编写一个程序,开启3个线程,这3个线程的ID分别为A.B. ...
- 线程同步 Lock接口
同步:★★★★★ 好处:解决了线程安全问题. 弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁. 定义同步是有前提的: 1,必须要有两个或者两个以上的线程,才需要同步. 2,多个线程必须保证使用 ...
- 15个顶级Java多线程面试题及答案
1)现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多线程问题比 ...
- 【Java】多线程冲突解决——同步锁
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827547.html 解决并行冲突最有效的方法就是加同步锁,主要有以下几种方法: 1:动态方法 ...
- Lock锁_线程_线程域
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- C# 多线程经典示例 吃苹果
本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解. 示例概述: 下面用一个模拟吃苹果的实例,说明C#中多线程的实现方法.要求开发一个程序实现如下情况:一个家庭有三个孩子,爸爸妈妈 ...
随机推荐
- ThreadLocal解决线程安全问题
一.线程安全问题产生的原因 线程安全问题都是由全局变量及静态变量引起的 二.线程安全问题 SimpleDateFormate sdf = new SimpleDateFormat();使用sdf.pa ...
- ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了 ps -A | gr ...
- js中的浅拷贝和深拷贝
说说最近所学:浅拷贝和深拷贝也叫做浅克隆和深克隆,深浅主要针对的是对象的"深度",常见的对象都是"浅"的,也就是对象里的属性就是单个的属性,而"深&q ...
- angularjs作用域
作用域(scope)①是构成AngularJS应用的核心基础,在整个框架中都被广泛使用,因此了解它如何工作是非常重要的.应用的作用域是和应用的数据模型相关联的,同时作用域也是表达式执行的上下文.$sc ...
- DevExpress GridControl使用方法总结
一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 (1).gridView.AddN ...
- SharePoint 2013 - REST API about Content
1. 获取所有子站点信息(Sub Site): var subSitesInfo = "{0}/_api/Web/WebInfos?$orderby=Title desc"; // ...
- 树莓派上安装2.8寸TFT触摸屏
在某宝的这里买了一个2.8寸的TFT触摸屏,其实就是中国版的ADAFRUIT 结合店家的帮助文档做了一下,一次点亮,这里也记录一下自己的安装过程(话说会硬件是会比会软件有不同的乐趣~~~) 由于店家推 ...
- Echarts ecomfe 触摸屏 touch 在IE10下无法显示悬浮框
问题描述: Windows 8 IE10浏览http://echarts.baidu.com/doc/example/line2.html 时,鼠标放置在数据点上时无法显示悬浮框. 正常情况为: 而现 ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- iOS支付宝集成详细流程
实现支付宝支付的准备工作: 1.向支付宝签约,成为支付宝的商户 签约完成后,支付宝会提供一些必要的数据给我们 商户ID:partner 账号ID:seller 即支付宝账号 签约需要营业执照 2.获取 ...