多线程——引言*
多线程——引言
售票场景
目前只有一个窗口开放售票(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实现线程A和B之间的通信必须经历2个步骤:
1.首先,线程A把本地内存A中的更新过的共享变量刷新到主内存中。
2.然后,线程B到主内存中去读线程A之间更新过的共享变量。
下面是示意图:

浙公网安备 33010602011771号