跟我学代码架构设计模式之--同步的引入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w1857518575/article/details/85197255

同步是什么?为什么要有同步?我来给你独到的分析。

先来思考几个相关的问题

# 计算机是用来干什么的?

答:帮我们解决对数据的计算和存储的,计算机中的硬件和软件都是为这一目的服务的!

# 计算机的最小执行单位是什么?

答:CPU指令,组成格式为指令码+操作数 ,有的指令没有操作数,有的指令有操作数。

# 我们编制的上层程序的最小执行单位是什么?

答:函数,函数也是我们指挥计算机帮我们对数据做计算和存储的最小操作单位!

# 函数的本质分类?

CPU指令分为有操作数指令和无操作数指令,这里我给函数划分为有关联资源的函数和无关联资源的函数

有关联资源的函数:函数的参数中,有传引用或者指针的数据。更抽象点说就是函数关联了外部资源,这个外部资源可以是堆区的数据、常量区的静态数据、甚至是文件、本地磁盘的文件、网络上的其他机器上的文件等等。

无关联资源的函数:函数的参数全是传值形式的,函数操作的资源都是自包含的--都在当前函数的栈帧当中!

扫描二维码关注公众号,回复: 4668798 查看本文章

# 线程是什么?

出乎你的意料,我对线程的定义很简单---线程就是干活的!除了可以执行一系列的函数,没有什么其他可说的!下文中的分析中关于线程部分,你就单纯的理解为是一个独立的干活的CPU就行~

同步的引入

# 同步涉及到的角色

函数、函数关联的资源、线程、锁

# 我们对正确操作的预期

对于一个函数,不管我们执行一次还是执行多次,执行多次的时候不管是分给一个线程执行,还是分给多个线程执行,我们最终想要的结果是可以预期的,不会产生二义性!简单的说 即: 我们的预期结果只和函数执行的次数有关,和有几个线程执行无关!或:一个函数执行多次,多线程执行得到的结果和单线程执行同样次数得到的结果是一致的!:一个函数并行执行多次的结果应该和顺序执行多次的结果是一致的! 我们下面要讲的同步都是在这个正确的预期下才有意义,假如你们有这个预期,那么同步就无从谈起了!

#  问题的产生

对于无操作资源的函数执行10次,一个线程执行10次和分多个线程共执行10次,最终产生的结果肯定是相同的!是肯定会满足我们对正确操作的预期的,因为函数执行所需的资源都是自包含的,都在栈帧中。

对于有关联资源的函数执行10次,单线程执行10次和多线程共执行10次的结果可能会是不同的!举个例子:一个函数的操作是取一个整形静态变量的当前值然后+1操作,初值为0的情况下,这个函数执行10次,我们预期这个变量的值应该为10,单线程的情况下执行10次,最终结果肯定满足我们的预期,多线程的情况下,却有可能得到结果是小于10的情况,因为有可能多个线程取当前值的时候取到的是同一个值,最后+1的时候实际上就加少了!

# 问题的解决思路

通过上面的问题,多线程环境下函数执行结果和我们的预期不一致的现象,我们可以可以分析出一个公共的原因:没有控制好函数执行的顺序! 只有控制好了顺序,才会满足函数在多线程执行10次的结果和顺序执行10次的结果一致!要想达到一致,要想结果符合预期,我们必须要设法让多个线程在访问关键资源的时候排队!这就是同步!!!我们可以让多线程访问公共资源的时候引入一个“看门人”,看门人确保访问资源的时候一个接一个的排队按顺序访问,不能一拥而上!这就是----锁保护机制!!!

(完)

猜你喜欢

转载自blog.csdn.net/w1857518575/article/details/85197255