Flask接口签名sign原理与实例代码浅析
233
2022-06-26
说到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的时候会查看一下对象的同步块索引所映射的同步块数组中的坑中信息来判断是否可以加锁。
不足点: 一定要挑刺的话,那就是这类人只是在听别人讲故事,到底是不是真的如此其实自己心里也没谱,只是一味的相信对方的人格魅力,而真正
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~