并发编程中的两个关键问题
线程之间如何通信及线程之间如何同步。
通信是指线程之间以哪种机制来交换消息,在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。
同步是指程序中用于控制不同线程间操作发生相对顺序的机制。
java内存模型的抽象结构
所有实例域,静态域和数组元素都储存在堆内存中,堆内存在线程之间共享,局部变量方法定义参数和异常处理参数不会在线程之间共享,他们不会有内存可见性问题,也不会受内存模型的影响。
本地内存是JMM的一个抽象概念,并不真实存在。(就是说一个线程操作主内存中的数据时,会把主内存中的数据拷贝一份到本地内存,线程操作的是本地内存中的数据)
并发编程模型的分类
现代处理器使用写缓冲区(类似于本地内存)临时保存向内存写入的数据。写缓冲区可以保证指令流水线持续运行,他可以避免由于处理器停顿下来等待向内存写入数据而产生的延迟。由于写缓冲区的存在,处理器对内存的读/写操作的执行顺序,不一定与内心实际发生的读/写顺序一致!
看下面一个例子
假设处理器A和处理器B按程序顺序并行执行内存访问,最终可以得到x=y=0 这个结果。
上面的过程中a=1是写操作,x=b是读操作,这两个操作在上图中是A1和A2过程,这两个过程的执行顺序在我们为您看来是A1到A2但实际执行过程中是会发生重排序的,处理器B中的执行过程也是同理。所以当执行完A2后切换到处理器B执行了B2就会出现x=y=0这种结果