Loading

多线程——引言*

多线程——引言


售票场景

​ 目前只有一个窗口开放售票(A地→B地),所有人都排队购票,这是单线程

​ 购票人数增加,为了减轻第一个窗口的压力,缩短整体购票时间,开放第二个窗口售票,这是多线程

「对于一个任务,单线程执行时间过长。启用多线程,每个线程分担的任务量都变小了,多个线程同时工作,整体耗费的时间也变短了。」

​ 中午12点了,窗口1的售票员要去吃饭了,窗口1暂停售票,窗口1售票员通知窗口2售票员自己先去吃饭,剩下的任务就交给窗口2了,这是线程之间的通信

​ 现在剩最后一张票了,售票员1准备出售这张票,售票员2也准备出售这张票,而实际只有一人能成功出售最后这张票,这是线程之间的同步

「线程之间的通信和同步是并发领域的两个关键问题,并发领域有不同的并发模型来解决不同的并发问题。Java在处理并发问题采用的并发模型是共享内存模型。」

共享内存模型

通信:通信是指两/多端作信息交流。在共享内存模型中,线程间的通信是通过内存的公共状态来实现的。举例:假设共100张票,售票员1卖票出第100张票的时候,会对余票100减1,变成99,而不是通知售票员2余票是99,售票员2通过查询系统获取余票数量,这是售票员1和2之间进行了隐式通信

同步:同步是指两/多端同时进行同一个动作。在共享内存模型中,线程间的同步需要显示指定这个动作是互斥的,同一时间只能一端执行。举例:售票员1和2在同一时间都要出售第1张票,同步机制指定只能一端执行,假设由售票员1卖出,售票员2会发现第1张票已经被卖了,于是会去找第2张票准备出售,这是售票员1和2之间在售票时进行了同步

Java内存模型(JMM)

为什么JMM模型是这么设计的?这个问题先放在这……有个工作内存,提高了工作速度?Why?
JMM抽象结构示意图

​ JMM实现线程A和B之间的通信必须经历2个步骤:

​ 1.首先,线程A把本地内存A中的更新过的共享变量刷新到主内存中。

​ 2.然后,线程B到主内存中去读线程A之间更新过的共享变量。

​ 下面是示意图:

线程A和B通信示意图
posted @ 2020-11-15 19:53  齐玉  阅读(65)  评论(0)    收藏  举报