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

  1. C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

    看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...

  2. 多线程同步工具——Lock

    本文原创,转载请注明出处. 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> 锁分独占锁与共享锁, ...

  3. java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

    一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...

  4. InnoDB:Lock & Transaction

    InnoDB 是一个支持事务的Engine,要保证事务ACID,必然会用到Lock.就像在Java编程一下,要保证数据的线程安全性,必然会用到Lock.了解Lock,Transaction可以帮助sq ...

  5. 使用四元数解决万向节锁(Gimbal Lock)问题

    问题 使用四元数可以解决万向节锁的问题,但是我在实际使用中出现问题:我设计了一个程序,显示一个三维物体,用户可以输入绕zyx三个轴进行旋转的指令,物体进行相应的转动. 由于用户输入的是绕三个轴旋转的角 ...

  6. 万向节锁(Gimbal Lock)的理解

    [TOC] 结论 我直接抛出结论: Gimbal Lock 产生的原因不是欧拉角也不是旋转顺序,而是我們的思维方式和程序的执行逻辑没有对应,也就是说是我们的观念导致这个情况的发生. 他人解释 首先我们 ...

  7. 在多线程编程中lock(string){...}隐藏的机关

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...

  8. 谈谈 Lock

    上来先看MSDN关于lock的叙述: lock  关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁.  下面的示例包含一个 lock 语句. lock  关键字可确保当一 ...

  9. LOCK TABLES和UNLOCK TABLES与Transactions的交互

    LOCK TABLES对事务不安全,并且在试图锁定表之前隐式提交任何活动事务. UNLOCK TABLES只有在LOCK TABLES已经获取到表锁时,会隐式提交任何活动事务.对于下面的一组语句,UN ...

  10. SQL 性能调优中可参考的几类Lock Wait

    在我们的系统出现性能问题时,往往避不开调查各种类型 Lock Wait,如Row Lock Wait.Page Lock Wait.Page IO Latch Wait等.从中找出可能的异常等待,为性 ...

随机推荐

  1. CentOS直接解压可用的memcached、nginx、keepalived

    Centos均基于x86_64版本,下面相关文件编译时使用用户组为www,用户为www 相关命令: groupadd -r www useradd -r -g www -M www memcached ...

  2. tomcat部署web项目的3中方法

    1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的一种Tomcat项目部署的方法,也是初学者最常用的方法. 2.在tomcat安装目录中有一个conf文件夹,打开此文件夹,其 ...

  3. mysql服务器和配置优化

    一.存储引擎 mysql中有多种存储引擎,一般常见的有三种:   MyIsam InnoDB Memory 用途 快读 完整的事务支持 内存数据 锁 全表锁定 多种隔离级别的行锁 全表锁定 持久性 基 ...

  4. php的socket通信

    socket通常叫做'套接字',用于描述IP地址和端口,是一个通信链的句柄.应用程序通过套接字向网络发出请求或者应答忘了请求.socket既不是程序,也不是协议,其只是操作系统提供的通信层的一组抽象A ...

  5. 安装rabbitMQ delayed-messaged

    由于一些原因,消息需要延迟发送给消费者,可以用delayed-messaged插件 在 /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/plugins目录下 # ...

  6. 修改shell提示符的显示格式

    默认的提示符显示方式如下: [root@localhost foldername]# 由于太长,希望能缩短到: [foldername]# 修改方式: # vim /etc/bashrc 找到第41行 ...

  7. Javascript学习笔记:3种递归函数中调用自身的写法

    ①一般的通过名字调用自身 function sum(num){ if(num<=1){ return 1; }else{ return num+sum(num-1); } } console.l ...

  8. oracle的imp导入时覆盖目标数据库

    背景:oracle正式库通过exp命令导出的dmp备份包,现在通过imp命令还原到测试库,测试库上面的表数据全部不要,要用新的. 方法:先删除用户.用户所在表空间,再新建用户和表空间,再imp导入. ...

  9. 16-腾讯-intership-面试

    问题 问:说一下在浏览器那里输入一个网址,会发生什么?答:DNS服务器解析,TCP三次握手,建立连接,然后bilibala............... 问:你对http相关协议熟悉吗?答:我问是ge ...

  10. Git初步学习

    版本控制系统version control system 多人协作开发 历史记录 恢复到任意历史版本-代码状态 错误恢复 多功能并行开发 版本控制系统分类: 本地版本控制系统---------个人计算 ...