1. 并发编程基础概念
并发——在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行——源自百度百科
在并发编程中,我们需要处理两个关键问题:线程之间如何通信和线程之间如何同步,后续篇章将围绕这两个问题进行介绍。
线程通信:是指线程之间以何种机制来交换信息,在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。
线程同步:是指程序用于控制不同线程之间操作发生相对顺序的机制。在Java中,可以通过volatile,synchronized, 锁等方式实现同步。
本文主要介绍java的通信机制,刚介绍常见通信机制主要包括以下两种方式:共享内存:线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。
消息传递:线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享。
Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。
2. JMM内存模型
JMM(Java Memory Model)是JVM规范中定义的一种Java内存模型,它的目的是屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台上到能达到一致的内存访问效果。
Java内存模型的主要定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。首先简单说明几个常用名称定义:变量:这里指包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,后者是线程私有的,不会被共享。
主内存:在java中,实例域、静态域和数组元素是线程之间共享的数据,它们存储在主内存中。
工作内存:每条线程都有自己的工作内存,线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工