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#多线程的更多相关文章

  1. Python3 GIL(Global Interpreter Lock)与多线程

    GIL(Global Interpreter Lock)与多线程 GIL介绍 GIL与Lock GIL与多线程 多线程性能测试 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线 ...

  2. 多线程-lock锁

    package 多线程.lock锁; import java.util.concurrent.locks.ReentrantLock; /*. * * //同步代码块 * * */ public cl ...

  3. 编写高质量代码:改善Java程序的151个建议(第8章:多线程和并发___建议126~128)

    建议126:适时选择不同的线程池来实现 Java的线程池实现从根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系 ...

  4. c++并发练习---多线程顺序打印

    参考:http://blog.csdn.net/liuxuejiang158blog/article/details/22061267 题目:编写一个程序,开启3个线程,这3个线程的ID分别为A.B. ...

  5. 线程同步 Lock接口

    同步:★★★★★ 好处:解决了线程安全问题. 弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁. 定义同步是有前提的: 1,必须要有两个或者两个以上的线程,才需要同步. 2,多个线程必须保证使用 ...

  6. 15个顶级Java多线程面试题及答案

    1)现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多线程问题比 ...

  7. 【Java】多线程冲突解决——同步锁

       转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827547.html    解决并行冲突最有效的方法就是加同步锁,主要有以下几种方法:   1:动态方法 ...

  8. Lock锁_线程_线程域

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  9. C# 多线程经典示例 吃苹果

    本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解. 示例概述: 下面用一个模拟吃苹果的实例,说明C#中多线程的实现方法.要求开发一个程序实现如下情况:一个家庭有三个孩子,爸爸妈妈 ...

随机推荐

  1. mybatis mapper association collection

    1.Question Description: sometimes, POJO bean contains another bean or collection as property, it's s ...

  2. 如何使用mybatis《二》

    前边阐述了如何在java项目中使用mybatis,我们使用的是映射文件的方式,在获得具体的数据操作方法时需要传入映射文件中namespace+“.”方法名称,这种方式有时候会感觉很不爽,很麻烦.我们在 ...

  3. Hibernate之lazy延迟加载(转)

    一.延迟加载的概念 当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的 ...

  4. 一个页面从输入 URL 到页面加载完的过程中都发生了什么事情?

    过程概述 浏览器查找域名对应的 IP 地址: 浏览器根据 IP 地址与服务器建立 socket 连接: 浏览器与服务器通信: 浏览器请求,服务器处理请求: 浏览器与服务器断开连接. 以下为详细解析: ...

  5. jQuery UI resizble、draggable的div包含iframe导致缩放和拖拽的不平滑解决方法

    前言 不仅仅是jQuery UI resizble的div包含iframe会导致缩放的不平滑,draggable也会出现包含iframe会导致拖放的不平滑,但是因为jQuery UI有为draggab ...

  6. .net学习总结

    .NET 学前入门 了解.Net能做什么 了解.NET,C#语言及其特点(分清.NET和C#的关系),对.Net学习有系统全面的认识. C#基础 变量,赋值运算符.数据类型转换等. 选择结构控制(if ...

  7. KindEditor编辑器在ASP.NET中的使用

    KindEditor编辑器在ASP.NET中的使用 最近做的项目中都有用到富文本编辑器,一直在寻找最后用的富文本编辑器,之前用过CKEditor,也用过UEditor,这次打算用 一下KindEdit ...

  8. .NET破解之100%营销QQ辅助软件【更新】

    应网友要求,更新一个以前的版本,效果如下: 更改方法 修改一:更改对象的可访问性 Assembly: RWXComLibrary, Version=2.1.0.3 Name: RWXComLibrar ...

  9. SharePoint 2010 文档管理系列

    前言,这是自己第一次写一个系列的文档,本来想使用SharePoint 2013版本,但是碍于SharePoint 2013对于硬件要求过高,自己的笔记本无法承受,所以退而求其次选择了在SharePoi ...

  10. File存储 - 文件存储

    博客地址 http://www.cnblogs.com/mmyblogs/p/6107472.html(转载请保留) 文件存储 文件存储是 Android 中最基本的一种数据存储方式,它不对存储的内容 ...