C#之Lock
lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(LockObject.MonitorIncrement);
Thread t1=new Thread(new ThreadStart(LockObject.LockIncrement));
t.Start();
t1.Start();
}
} public class LockObject
{
/// <summary>
/// 多线程共享数据
/// </summary>
private static int counter = ;
/// <summary>
/// 同步对象,推荐这种写法
/// 应避免锁定 public 类型,否则实例将超出代码的控制范围
/// 具体如:lock (this)、lock (typeof (MyType)) 和 lock ("myLock")
/// </summary>
private readonly static object synisynchronize = new object(); public static void MonitorIncrement()
{
///Monitor.Enter 与 Monitor.Exit 相当于Lock
Monitor.Enter(synisynchronize);
Thread.Sleep();
counter++;
Console.WriteLine("MonitorIncrement counter={0}", counter);
Monitor.Exit(synisynchronize);
} public static void LockIncrement()
{
///lock在开始时调用 Monitor.Enter
///在结束时调用 Monitor.Exit 。
lock (synisynchronize)
{
counter++;
Console.WriteLine("LockIncrement counter={0}" ,counter);
}
}
}
运行结果如下图示:
aaarticlea/png;base64,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" alt="" />
C#之Lock的更多相关文章
- C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...
- 多线程同步工具——Lock
本文原创,转载请注明出处. 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> 锁分独占锁与共享锁, ...
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...
- InnoDB:Lock & Transaction
InnoDB 是一个支持事务的Engine,要保证事务ACID,必然会用到Lock.就像在Java编程一下,要保证数据的线程安全性,必然会用到Lock.了解Lock,Transaction可以帮助sq ...
- 使用四元数解决万向节锁(Gimbal Lock)问题
问题 使用四元数可以解决万向节锁的问题,但是我在实际使用中出现问题:我设计了一个程序,显示一个三维物体,用户可以输入绕zyx三个轴进行旋转的指令,物体进行相应的转动. 由于用户输入的是绕三个轴旋转的角 ...
- 万向节锁(Gimbal Lock)的理解
[TOC] 结论 我直接抛出结论: Gimbal Lock 产生的原因不是欧拉角也不是旋转顺序,而是我們的思维方式和程序的执行逻辑没有对应,也就是说是我们的观念导致这个情况的发生. 他人解释 首先我们 ...
- 在多线程编程中lock(string){...}隐藏的机关
常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...
- 谈谈 Lock
上来先看MSDN关于lock的叙述: lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁. 下面的示例包含一个 lock 语句. lock 关键字可确保当一 ...
- LOCK TABLES和UNLOCK TABLES与Transactions的交互
LOCK TABLES对事务不安全,并且在试图锁定表之前隐式提交任何活动事务. UNLOCK TABLES只有在LOCK TABLES已经获取到表锁时,会隐式提交任何活动事务.对于下面的一组语句,UN ...
- SQL 性能调优中可参考的几类Lock Wait
在我们的系统出现性能问题时,往往避不开调查各种类型 Lock Wait,如Row Lock Wait.Page Lock Wait.Page IO Latch Wait等.从中找出可能的异常等待,为性 ...
随机推荐
- css-position
值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "top", " ...
- 远程执行shellcode
#include "Windows.h" #include <WinSock2.h> #include <stdio.h> #pragma comment( ...
- nignx 负载均衡的几种算法介绍
负载均衡,集群必须要掌握,下面介绍的负载均衡的几种算法. 1 .轮询,即所有的请求被一次分发的服务器上,每台服务器处理请求都相同,适合于计算机硬件相同. 2.加权轮询,高的服务器分发更多的请求 ...
- Linux解读
Linux中权限(r.w.x)对于目录与文件的意义 一.权限对于目录的意义 1.首先要明白的是目录主要的内容是记录文件名列表和子目录列表,而不是实际存放数据的地方. 2.r权限:拥有此权限表示可以读取 ...
- 锁相关知识 & mutex怎么实现的 & spinlock怎么用的 & 怎样避免死锁 & 内核同步机制 & 读写锁
spinlock在上一篇文章有提到:http://www.cnblogs.com/charlesblc/p/6254437.html 通过锁数据总线来实现. 而看了这篇文章说明:mutex内部也用到 ...
- HDFS 核心原理
HDFS 核心原理 2016-01-11 杜亦舒 HDFS(Hadoop Distribute File System)是一个分布式文件系统文件系统是操作系统提供的磁盘空间管理服务,只需要我们指定把文 ...
- 远程重装centos6
写得比较简略,也是综合网络上的文章,总结一下实操的经验 获取启动内核 wget -P /boot/ http://mirrors.163.com/centos/6.8/os/x86_64/images ...
- 哈希表(Hash Table)
参考: Hash table - Wiki Hash table_百度百科 从头到尾彻底解析Hash表算法 谈谈 Hash Table 我们身边的哈希,最常见的就是perl和python里面的字典了, ...
- adb push命令的使用
最近刚接触一种工具(命令),什么命令呢?就是adb命令,对这个命令纯属一个小白鼠,什么都不懂,所以只能adb --help 一下参数,然后就尝试着使用. 今天遇到一个问题,需要将某个文件拷到小机上面, ...
- 分页组件 - layui.laypage
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...