说到lock锁,我相信在座的各位没有不会用的,而且还知道怎么用不会出错,但让他们聊一聊为什么可以锁住,都说人以群分,大概就有了下面低中高水平的三类人吧。

第一类人

将lock对象定义成static,这样就能让多个线程看到同一个对象,以此实现线程间互斥和保证同步,如果再深问为什么?就怕遮遮掩掩的说好像每个实例都有一个同步块索引,再展开的话就顶不住了,反正大家都这么写,我也不敢问,我也不会说,如果上代码,只能这样丢给你。


public class Program
{
public static object lockMe = new object(); public static void Main(string[] args)
{
var task1 = Task.Factory.StartNew(() =>
{
lock (lockMe)
{
//todo
}
}); var task2 = Task.Factory.StartNew(() =>
{
lock (lockMe)
{
//todo
}
}); Task.WaitAll(task1, task2);
}
}

第二类人

这类人可能看过CLR via C# 这样类似圣经级著作,而且对相关概念也比较清楚。

1. 清楚‘引用类型’ 在堆上的布局结构及栈上的指针是指向方法表索引(类型对象指针),如下图。

2. 清楚当lock住对象后,它的‘同步块索引’ 和 CLR上的‘同步块数组’是呈现一个关联关系,然后又是一张图。

牛X点: 仅仅用了两张图就把这个事情解决的相当完美,读者一看就明白了,然来是每个线程在lock的时候会查看一下对象的同步块索引所映射的同步块数组中的坑中信息来判断是否可以加锁。

不足点: 一定要挑刺的话,那就是这类人只是在听别人讲故事,到底是不是真的如此其实自己心里也没谱,只是一味的相信对方的人格魅力,而真正

最新文章

  1. Hibdernate入门
  2. easyui关于validatebox实现多重规则验证的实践
  3. 【转载】让你的MATLAB代码飞起来
  4. b/s结构的物业管理系统(一)-------登录篇
  5. 原生JS:Date对象详细参考
  6. HTML5 RPG游戏引擎 地图实现篇
  7. 基于注释配置bean和装饰bean
  8. appium 解锁九宫格
  9. C. Polycarp at the Radio
  10. 委托与lambda关系
  11. C# windows定时服务+服务邮箱发送
  12. Docker----搭建自己的gitlab(填坑之旅)
  13. 【原创】大数据基础之Flink(1)简介、安装、使用
  14. InstallShield Limited Edition for Visual Studio 使用
  15. macbook 安装win7
  16. 第二周javaweb学习进度表
  17. hdu2609 How many【最小表示法】【Hash】
  18. private static final Logger logger= LoggerFactory.getLogger(WhMainBusi.class);
  19. Python面向对象之异常捕获(一)-----抛出一个异常
  20. Oracle VirtualBox添加虚拟机

热门文章

  1. java-选中排序(新手)
  2. 选择tomcat时候提示Project facet Java version 1.8 is not supported.解决办法
  3. jvm 性能调优工具之 jstat 命令详解
  4. 信号与系统实验序章0——MATLAB基础命令入门
  5. C++中 string 中的方法的使用详解
  6. Building Applications with Force.com and VisualForce(Dev401)(十四):Implementing Business Processes:Auditing Processes
  7. 洛谷5026 Lycanthropy 差分套差分
  8. Vue组件通信方式全面详解
  9. 7.Maven命令
  10. 一个基于深度学习回环检测模块的简单双目 SLAM 系统