一、基础
问题:线程之间如何通信,以及线程之间如何同步。
通信:多个线程之间如何交换信息。
通信的方式:共享内存(隐式的)和消息传递(显式的)。
对应的并发编程模型有两种:共享内存的并发编程模型和消息传递的并发编程模型。
同步:用于控制不同线程之间操作发生相对顺序的机制。
也有显示同步和隐示同步。
共享内存的并发编程模型需要进行显示的同步。
消息传递的并发编程模型会隐示的进行同步。
Java并发编程模型使用的共享内存的并发编程模型。
二、JMM
问题: Java中的线程是如何进行消息传递的?
Java堆内存在线程之间是共享的、栈不是。
实例域、静态域、数组都存放到堆中。称之为共享变量。
JMM控制着一个线程对共享变量的写入对另一个线程何时可见。
下面具体描述线程中的本地内存和主内存中之间关系:
线程中的共享变量存放到主内存中。
每一个线程都有一个私有的本地内存,本地内存是一个抽象概念,具体包括:缓存、写缓冲区、寄存器、其他的硬件和编译器的优化。
线程A和B通信的步骤:
1、线程A首先将本地可能已经改变的共享变量的副本刷新进入主内存。
2、然后线程B从主内存中读取该变量,然后更新自己变量的副本。
从今天开始跑,加速度的跑、不要回头、当速度足够块的时候,你将看到一些你从未看到过的风景。 --安藤忠雄