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. [moka同学笔记]yii2.0小物件的简单使用(第一种方法)

    这是第一种方法,还有另一种方法,其实都差不多. 1.在创建widgets\HelloWiget.php <?php /** * Created by PhpStorm. * User: Admi ...

  2. Linux命令详解之—pwd命令

    Linux的pwd命令也是一个非常常用的命令,本文为大家介绍下Linux中pwd命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux pwd命令用于显示工作目录. 执行pwd指 ...

  3. 转收藏:Git常用命令速查表

    一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r ...

  4. Chrome使用技巧(几个月的心得)

    转用Chrome,不仅仅因为它的插件之丰富,更因为它的响应速度其他浏览器都望尘莫及.接着我就要写写一些心得. 如何最简易地用上谷歌搜索? 1,下载hosts文件:https://pan.baidu.c ...

  5. 文科生也能看懂的iptables教程(转载)

    据说还是个MM, 写得很通俗易懂, 还很诙谐, 原文:http://dallascao.com/cn/iptables-tutorial-for-newbies/ 对于斗胆开始玩vps的文科生来讲,i ...

  6. Ideal-image-slider 幻灯片

    在线实例 实例演示 默认效果 实例演示 淡入淡出 实例演示 带链接 实例演示 项目导航 实例演示 带标题描述 实例演示 回调函数 实例演示 自定义切换 使用方法 <div class=" ...

  7. 初学Node(二)package.json文件

    package.json简介 package.json在Node项目中用于描述项目的一些基本信息,以及依赖的配置,一般每一个Node项目的根目录下都有一个package.json文件. 在项目的根目录 ...

  8. 响应式SharePoint模版页

    一张好的皮肤显然的会给你的项目加分不少.特别是大部分的项目,UI甚至可以决定成败. SharePoint在这方面一直都做得不好,曾经我有好多项目都是坐在美工旁边来一起修改样式.痛苦的经历. 不久以前, ...

  9. C语言原子接口与实现

    原子是一个指向唯一的.不可变的0个或任意多个字节序列的指针,大多数原子都是指向以空字符结束的字符串,但是任何一个指向任意字节序列的指针都可以使原子.任何原子只能出现一次.如果两个原子指向同一个内存单元 ...

  10. JAVA基础学习day24--Socket基础一UDP与TCP的基本使用

    一.网络模型 1.1.OIS参考模型 1.2.TCP/IP参考模型 1.3.网络通讯要素 IP地址:IPV4/IPV6 端口号:0-65535,一般0-1024,都被系统占用,mysql:3306,o ...