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#中多线程的实现方法.要求开发一个程序实现如下情况:一个家庭有三个孩子,爸爸妈妈 ...
随机推荐
- phpcms v9 升级视频云问题推荐位不能添加
因为使用的是v9的早期版本,后来升级的时候没敢升级数据库,直接使用了老的数据库结构,造成[推荐位]添加不能使用,报告没有thumb列. 查看数据库果然没有,没办法要么添加相关的列,要么禁用上传缩略图. ...
- Python数学运算的一个小算法(求一元二次方程的实根)
请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax² + bx + c = 0的两个解. #!/usr/bin/env python # -*- coding: ...
- seajs快速了解
详情请点击原文 SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制.与jQuery等JavaScript框架不同,S ...
- 高性能JS笔记2——数据存取
数据存取性能而言: 字面量>本地变量>数组元素>对象成员 一.标识符解析的性能 标识符解析是有代价的,一个标识符的位置越深,它的读写速度也就越慢. 局部变量的读写速度是最快的,全局变 ...
- android 回调函数二:应用实例
前言:如果对android回调的概念不明白的请看:android 回调函数一:基本概念 1.定义接口 package com.app.util; public interface ZYJCallBac ...
- LayoutTransition实现显示、隐藏动画
public class Main4Activity extends Activity { private TextView tv1; private Button button1; private ...
- iOS设计模式之原型模式
原型模式 基本理解 原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节 ...
- HashMap,HashTable,TreeMap区别和用法
开始学HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的.需要大家注意,在实际开发中以需求而定. java为数据结构中的映射定义了一 ...
- IOS 杂笔-18 (let 与 var)
var 是 variable的缩写形式,是变量的意思 ,是可改变的,并不是数据类型. let 是常量的意思,不可改变的.
- Android线程池(一)
本篇文章主要介绍Android自带的线程池的使用. 首先要引入线程池的概念 线程池:是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务. 线程池线程都是后台线程.每个线 ...