线程同步问题(1)

101 阅读2分钟

线程的同步问题

线程同步问题的实质,就是数据的一致性问题,就是一项数据的改变,能否及时为“大多数”所知的问题。

案例:生产者-消费者模型

输入图片说明

一个用于描述线程同步问题的经典案例,就是“生产者-消费者”模型,它的含义在于: 对一个区域做数据读写,其中,一部分线程,负责读取并增添数据,这部分线程被称为 “生产者” 还有一部分线程,负责读取并削减数据,这部分线程,被称为“消费者” 而这部分存储数据的区域,则被称为“数据缓冲区”,它需要确保数据在一个有限的区域内波动

而现在的问题就在于,由于我们的线程,在读取数据缓冲区与操作数据缓冲区的期间,有一个时间差,而这期间的任务调度,就可能引发问题。

输入图片说明

让我们来构想一个场景,一个缓冲区,区间在 [0, 5] 且取值只能为整数,而当下数据为 4,有两个生产者线程正在做着读写的工作,而由于任务切换的缘故,出现了如下的序列,那么最终的运作结果,就是 6, 缓冲区溢出:

运作流程的文字形式:

线程 A: 读取缓冲区(4) -> 判断增添后是否会超限(增添后是5,不会) -> 增添缓冲区数据(缓冲区为 5) 线程 B: 读取缓冲区(4) -> 判断增添后是否会超限(增添后是5,不会) -> 增添缓冲区数据(缓冲区为 6)-> 缓冲区溢出

运作流程的图片形式:

输入图片说明

我们可以发现的事情是,由于两个生产者线程并不知道对方要给缓冲池增添数据,且在缓冲区完成了第一轮数据增添以后(线程A让缓冲区达到了上限),另一个生产者线程没能及时得到信息(线程 B 掌握的缓冲池子数据已经过时),所以最终导致了溢出的结局。