(C#) Lock - 将对象上锁,互斥多个线程,使同步。
C# Lock
原文:http://www.dotnetperls.com/lock
Locking is essential in threaded programs. It restricts code from being executed by more than one thread at the same time. This makes threaded programs reliable. The lockstatement uses a special syntax form to restrict concurrent access.
Note:Lock is compiled into a lower-level implementation based on threading primitives.
Example
Here we see a static method "A" that uses the lock statement on an object. When the method A is called many times on new threads, each invocation of the method accesses the threading primitives implemented by the lock.
Then:Only one method A can call the statements protected by the lock at a single time, regardless of the thread count.
Program that uses lock statement: C# using System;
using System.Threading; class Program
{
static readonly object _object = new object(); static void A()
{
// Lock on the readonly object.
// ... Inside the lock, sleep for 100 milliseconds.
// ... This is thread serialization.
lock (_object)
{
Thread.Sleep(100);
Console.WriteLine(Environment.TickCount);
}
} static void Main()
{
// Create ten new threads.
for (int i = 0; i < 10; i++)
{
ThreadStart start = new ThreadStart(A);
new Thread(start).Start();
}
}
} Possible output of the program 28106840
28106949
28107043
28107136
28107246
28107339
28107448
28107542
28107636
28107745
In this example, the Main method creates ten new threads, and then calls Start on each one. The method A is invoked ten times, but the tick count shows the protected method region is executed sequentially—about 100 milliseconds apart.
Note:If you remove the lock statement, the methods will be executed all at once, with no synchronization.
Intermediate representation
Let's examine the intermediate representation for the lock statement in the above example method A. In compiler theory, high-level source texts are translated to lower-level streams of instructions.
Tip:The lock statement here is transformed into calls to the static methods Monitor.Enter and Monitor.Exit.
Also:The lock is actually implemented with a try-finally construct. This uses the exception handling control flow.
Intermediate representation for method using lock .method private hidebysig static void A() cil managed
{
.maxstack 2
.locals init (
[0] object obj2)
L_0000: ldsfld object Program::_object
L_0005: dup
L_0006: stloc.0
L_0007: call void [mscorlib]System.Threading.Monitor::Enter(object)
L_000c: ldc.i4.s 100
L_000e: call void [mscorlib]System.Threading.Thread::Sleep(int32)
L_0013: call int32 [mscorlib]System.Environment::get_TickCount()
L_0018: call void [mscorlib]System.Console::WriteLine(int32)
L_001d: leave.s L_0026
L_001f: ldloc.0
L_0020: call void [mscorlib]System.Threading.Monitor::Exit(object)
L_0025: endfinally
L_0026: ret
.try L_000c to L_001f finally handler L_001f to L_0026
}
Relativity
By using the lock statement to synchronize accesses, we are creating a communication between time and state. The state is connected to the concept of time and sequential accesses to the lock.
In the Theory of Relativity, there is also a communication between time and state. This is the speed of light, which is a constant based on the relation of time and space. This connection is present also in locks—in threading constructs.
Tip:For a better description of how relativity mirrors concurrent synchronization, please see the wizard book.
Summary
We examined the lock statement in the C# language, first seeing its usage in an example program, and then describing this synchronization. Next, we stepped into the intermediate representation and its meaning in compiler theory.
Finally:We related the Theory of Relativity and the complexities of the physical universe to the lock statement.
(C#) Lock - 将对象上锁,互斥多个线程,使同步。的更多相关文章
- Linux的线程同步对象:互斥量Mutex,读写锁,条件变量
进程是Linux资源分配的对象,Linux会为进程分配虚拟内存(4G)和文件句柄等 资源,是一个静态的概念.线程是CPU调度的对象,是一个动态的概念.一个进程之中至少包含有一个或者多个线程.这 ...
- python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02
目录 进程补充 进程通信前言 Queue队列的基本使用 通过Queue队列实现进程间通信(IPC机制) 生产者消费者模型 以做包子买包子为例实现当包子卖完了停止消费行为 线程 什么是线程 为什么要有线 ...
- 死锁、Lock锁、等待唤醒机制、线程组、线程池、定时器、单例设计模式_DAY24
1:线程(理解) (1)死锁 概念: 同步中,多个线程使用多把锁之间存在等待的现象. 原因分析: a.线程1将锁1锁住,线程2将锁2锁住,而线程1要继续执行锁2中的代码,线程2要继续执行锁1中的代码, ...
- Java并发编程,互斥同步和线程之间的协作
互斥同步和线程之间的协作 互斥同步 Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLo ...
- GIL互斥锁与线程
GIL互斥锁与线程 GIL互斥锁验证是否存在 """ 昨天我们买票的程序发现很多个线程可能会取到同一个值进行剪除,证明了数据是并发的,但是我们为了证明在Cpython中证 ...
- Linux多线程——使用互斥量同步线程
前文再续,书接上一回,在上一篇文章: Linux多线程——使用信号量同步线程中,我们留下了一个如何使用互斥量来进行线程同步的问题,本文将会给出互斥量的详细解说,并用一个互斥量解决上一篇文章中,要使用两 ...
- Linux多线程--使用互斥量同步线程【转】
本文转载自:http://blog.csdn.net/ljianhui/article/details/10875883 前文再续,书接上一回,在上一篇文章:Linux多线程——使用信号量同步线程中, ...
- WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变
本文说明WPF [调用线程无法访问此对象,因为另一个线程拥有该对象.] 解决方案以及如何实现字体颜色的渐变 先来看看C#中Timer的简单说明,你想必猜到实现需要用到Timer的相关知识了吧. C# ...
- 使用原子类或synchronized(没用Lock)解决阐述多线程所遇到线程安全问题和解决方案
例子题目: 创建10个线程,每个线程执行10000次加1,输出总和 正常结果100000 但是如果出现线程不安全会低于100000 import java.util.concurrent.Count ...
随机推荐
- makefile--目标搜索(八)
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 在一个较大的工程中,一般会将源代码和二进制文件(.o 文件和可执行文件)安排在不同的目录来进行区 ...
- 新浪代码部署手册 git管理工具
目前新浪云上的应用支持通过Git和SVN来部署代码. Git仓库地址 https://git.sinacloud.com/YOUR_APP_NAME SVN仓库地址 https://svn.sinac ...
- POJ-3162 Walking Race (求树上两点之间最大距离)
题目大意:给一棵树,对于所有的点,找出距它最远点的距离,然后将这些距离排成一列,找出最长的一个区间满足:其中的最大值减去最小值不大于m. 题目分析:两次dfs找出距每个节点的最远距离,然后可以通过维护 ...
- JS中的call()方法的理解
fn.call(obj,arg1,arg2);这是call()方法的使用形式,apply()是差不多的.作用是用obj对象来替换fn中的this 举个栗子: function A(){ this.co ...
- console下纯字符实现的贪吃蛇
最近简直超级无聊-- code blocks win7 64编译运行无问题,应该其他编译器也不会有问题. w:上 s:下 a:左 d:右 CS标准方向控制,AK47和M4这种高级货是没有滴-- 废话不 ...
- Android 开发 之 Fragment 详解
本文转载于 : http://blog.csdn.net/shulianghan/article/details/38064191 本博客代码地址 : -- 单一 Fragment 示例 : http ...
- 两种不同的Context
本文转载于:http://blog.csdn.net/xiaodongvtion/article/details/8443772 这是两种不同的context,也是最常见的两种.第一种中context ...
- Fortran编译多个文件(转载)
最近需要在Linux系统下编译多个Fortran程序,在网上搜索了一下,但是资料不多,也许因为这个问题比较简单,不值一提,但还是把我知道的写出来,供大家参考: 方法一: 假如现在有两个Fortran程 ...
- 常见HTTP状态(304,200等)
一些常见的状态码为: 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务器超时 下面提供 HTTP 状态码的完整列表.点击链接可了解详情.您也可以访问 HTTP 状态码上的 ...
- 论文笔记之:Learning to Track: Online Multi-Object Tracking by Decision Making
Learning to Track: Online Multi-Object Tracking by Decision Making ICCV 2015 本文主要是研究多目标跟踪,而 online ...