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,iVBORw0KGgoAAAANSUhEUgAAARQAAABkCAIAAADIR1hbAAAIeElEQVR4nO2cz4scRRTH+y8IAX/kGEEPxpuIuIEQDEoYs/gjCUJYTRbESAQlLuwuao5GMEFy8KAgySHx4EVByCEkspvZzB/hMYGcAx5FD+NhQ6e33o969bp6q6fn+6EJvdVVr15Vv8/2zO5sqgf3H45nlq2Bcm+4TAZEBXl6SOkK75DSBZ8TyNNHSld4h5Qu+Jww8ty9e/fW7Y1bdzYjx+2Nzc3NIs7UlC7yrihd4R1SuuBzwshz7PzV187fOrTy56GVO/Q4srbx+urGkfXNN1f+WPz8pxu//lZEm21KF3lXlK7wDild8Dlh5Nl/4a993/+97/Ijejx76dEHN/999/f/lm/+8+OVXw5+eP3k2QtFtNmmdJF3RekK75DSBZ8TRp63v77x8tIXr5xeZ4+Dy+sLy+sHl9ePnPnspfcuHl1alSp7z969zUPXgO0TRGiGoo1bW1tSf9qzCW3XByqNMyFPM/loO+2Wa/bSlZ8BRp63TpytbDx94Pji8ldRGdzysJLQq5IJbHGznkjtuiS7LE+WOm4GST3PwmQyGbI8R49/UlXVaDSaTqfT6XQ0GtW2TKfTpjxPvXh88Qwjj8UW46js8lhEMsoTkNGfaN1nwShM3nknw5bnjXc+2vZkNBptK1RrE7jkk4fVILs8lieGQx5FEr2dWq2nWh/3dr6goqVM2/X+zQ5sfRvlaZOnRR7amd00pX/XaPLQ12m1S13Iww7soTxbO59vuj/RHNhzexFL/aP+WAIqjanz1ucT25OHOhOcs+bQ804RX7axT57g4ZP3ZdsMyWNRxWiasgR7WUvFmipPrp655Gke9JKxf3ekvecJHj67IE/gD3uJLd+W8ijFnSqP3pkdYq/X1CJWxkrdCsqjXGLlyWWFEVEeC5I8Y/WnbZIJkj955ZGEMRa3JKQkid5farEXt9Q/WsTKucUf97wT7iUWrXvaJzgPRkn9O4X7hMHJc0Z5njlw4tiZL1kHlKLPIg+9SbTc2Xap3JV2KoM0RJJHn0KaVFJlD/cQ0CtYusoGiVraft7AAbbWg56TmfiBweFTF5979f3nF5b044WFU/sPrx47vSbJ40ZRK4DWbh+QvLJ3U54ABWGlSmV3ynp3YOT55srP59a++3TtUvQ4t/rt5R+uZpfHTu6y3yX0Z9dWX+XJQumCzwn+JKGPlK7wDild8DmBPH2kdIV3SOmCzwnk6SOlK7xDShd8TiBPHyld4R1SuuBzAnn6SOkK75DSBZ8TyNNHSld4h5Qu+JxUD+4/xIEDh+OoHtx/eO3adRw4cKQej+VZOf8xDhw4ko4n8hg/zwYAeAzkAcAJ5AHACeQBwEktz/ZvTur24EsH7SPokbuLD7pggDcrkGd7hVlKk42Qawdn3Zy+Jd91PrN+v3ioPN19X88Yc6ZvRt+S7zSfIb9MsMjDrl/RzNJfukQbK+7u6pMm5UOj5c3fHkfCsS7pPOO69H1TshoO9D1PsC/6zaDnNbQx2k3accvNcOTJxo+Obb8/7D5IpMbPlU/qvtlXMRyiPzBw3Ayp0XeTaBrR4NHclPhjQhAntb8leQWps2WuNvlI66rk+xIdYlzyzNB/edi09eDR3JLSDtqDbYn2T1qXMUklvuN+Je1Dav7uITNAEXna3NRo8Jbxo2ODJbSZV1mge1258kndN/sqhoPl9zzjBkqH4JIyKthHvSfd9Db5ZInfcn+kfZCQUo22VwYxlHxS9y2avH3UbIBPGADgBPIA4ATyAOAE8gDgBPIA4ATyAOAE8gDghP1gaJuASpBh/rB/uOB+RWg+eXJtkxJn1u9E35LvLh/9l6qgqiBPCn1LvtN8IE8cizzS41tvp+fsFOOdROM3W6RLUqOjvyWOhGNd0nnGden7xi7NuN65IyqPflPpefNLGlBv8cWnc7HnQbc281pIjZ8rn9R9S1oI2IEij73IAsYN2EtSS2r8iiuIYOpmh6T+7IbYy0jqbJmrTT7Suiph3yxDjEueOyR5lF2m5wHsWGlUm/jRxiAZPbdoDkmVlBo/9VyaInXfHEsAj8kij3JTo/e7i6KRFpJrXZaqSo2fK5/UfUvNHzzB/R+ASO3s2Gh/eh6NT29nNH7LfOjqdJL2LQhOT+z5pO5bNHn7qPkCnzAAwAnkAcAJ5AHAiUUe/fUuvRp9fex+Ae2OnKudvYT3A3NK8NO2up2+X5TeOLKlE/XN8h5XT0PqL80YzSRYflLyUmcwZIInj10P/aql+BQho9GikjQjG2Vjz/WpozKDIUPlqS8ZK4PWqz7KboLUR+kfzKic0Dj6QGVqCDOnuN/zpKrVHOWOr8vJRrb0H+/8LWrwL82zvqrHBwNHksdSrHVPOlaajq2tXNUWZDjmHjLNE0t/KbgSNsNKwEzQ/i9JLZUn9dT711ftDlM3aARp9qSJ2HlhznxBnzx6MdEIUo0Goyw1qherXsR6H6msx5zz+mKDc2gzv+jyBJ3ZFqWmLfUtdYsGpPNS/cac1UqEZiilAztEWQIYJu4nD1thUXPY9qg8EkrwIDd20iAU/bcSdkPPSl8OGA4tnzwVEUYZnhTWB03GXty6PPZ5wbyQ5T0PbVGKKUkevZSjoZIcsJhvSZLGtEfruj/IiSQPe0vs8kgRlP4stC51f+jTQ6nsekh0FrY/7Sx9H4E8w4SVRyq4qAzBjWRvbVMtiWgmlWCFZIKlrPUSlMpUEgkMH+N7HqlSq50y0PhGA6MojkkpKRHsUyj92YkgzxyhfDzH8j0VtQLmF/wxHABOIA8ATiAPAE4gDwBOIA8ATiAPAE4gDwBOIA8ATiAPAE4gDwBOIA8ATiAPAE4gDwBOIA8ATiAPAE4gDwBOIA8ATiAPAE4gDwBOIA8ATiAPAE4gDwBOIA8ATiAPAE4gDwBOIA8APv4Hd2iBIUlmoHQAAAAASUVORK5CYII=" 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等.从中找出可能的异常等待,为性 ...
随机推荐
- 新版微信h5视频自动播放
微信最近升级了新版本,直播视频不能自动播放,经过了一番探索,发现下列方法可以实现自动播放. if (typeof WeixinJSBridge == "undefined") { ...
- eclipse最有用快捷键整理
在网上搜eclipse快捷键,可以搜出一大堆,大多罗列了n多的快捷键,估计大部分人看了以后都会头大的,我也头大,不过我一一尝试了一遍,整理出了eclipse最常用最有用,写代码必须用到的一些快捷键,大 ...
- js 定义方法的集中方式
1:调用关键字function来构造 如: function distance(x1,x2,y1,y2) { var dx = x2 - x1; var dy = y2 ...
- AraxisMerge和beyond Compare做git mergetool配置
打开.gitconfig文件,加入如下代码即可 [diff] external = /Applications/AraxisMerge.app/Contents/Utilities/araxisgit ...
- 退役&&搬家
牡丹江与鞍山两站作为最后的结束站.一银一铜就此结束了~ 此博客用来怀念ACM就此保留并不添加任何其它与其无关内容. ------------------------------------------ ...
- ROS学习笔记(四)——环境变量配置
1.查看环境变量配置情况,其实并没有什么卵用 $ export | grep ROS 或者用 $ printenv | grep ROS2.配置环境变量??$ source /opt/ros/indi ...
- Python文件使用“wb”方式打开,写入内容
Python文件使用"wb"方式打开,写入字符串会报错,因为这种打开方式为:以二进制格式打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. 所以写入 ...
- ubuntu的一些常用命令,测试版本:Ubuntu 12.04.5 LTS
最近配置了一台Linux服务器,选用的是Ubuntu 12.04.5 LTS版本. 把之前放在Windows Server 2003上的网站移到了现在的服务器上,给我的感受用一个字形容:真JB快! 网 ...
- Html5导航插件,支持水平/垂直展示
/*========================= CSS STYLE=========================== */ .tabWrap {} .tabWrap ul { paddin ...
- tab,tabCon里放很多div,点击左右滑动一个。可根据初始化清除空的tabCon。
效果如上,左右箭头点击,相应左右滑动一个功能菜单的长度,点击BTN2时若所有功能菜单没溢出就不显示箭头不允许左右滑动. 可根据初始化功能菜单的个数,判断.若某个tabCon没有内容,则删除相应tabC ...