欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一个lock锁就可以分出低中高水平的程序员对问题的处置方式

程序员文章站 2022-05-04 11:50:46
说到lock锁,我相信在座的各位没有不会用的,而且还知道怎么用不会出错,但让他们聊一聊为什么可以锁住,都说人以群分,大概就有了下面低中高水平的三类人吧。 第一类人 将lock对象定义成static,这样就能让多个线程看到同一个对象,以此实现线程间互斥和保证同步,如果再深问为什么?就怕遮遮掩掩的说好像 ......

说到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. 清楚‘引用类型’ 在堆上的布局结构及栈上的指针是指向方法表索引(类型对象指针),如下图。

一个lock锁就可以分出低中高水平的程序员对问题的处置方式

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

一个lock锁就可以分出低中高水平的程序员对问题的处置方式

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

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