java并发编程 --并发问题的根源及主要解决方法
文章目录 并发问题的根源在哪 缓存导致的可见性 线程切换带来的原子性 编译器优化带来的有序性 主要解决办法 避免共享 Immutability(不变性) 管程及其他工具 并发问题的根源在哪 首先,我们要知道并发要解决的是什么问题?并发要解决的是单进程情况下硬件资源无法充分利用的问题。而造成这一问题的主要原因是CPU-内存-磁盘三者之间速度差异实在太大。如果将CPU的速度比作火箭的速度,那么内存的速度就像火车,而最惨的磁盘,基本上就相当于人双腿走路。 这样造成的一个问题,就是CPU快速执行完它的任务的时候,很长时间都会在等待磁盘或是内存的读写。 计算机的发展有一部分就是如何重复利用资源,解决硬件资源之间效率的不平衡,而后就有了多进程,多线程的发展。并且演化出了各种为多进程(线程)服务的东西: CPU增加缓存机制,平衡与内存的速度差异 增加了多个概念,CPU时间片,程序计数器,线程切换等,用以更好得服务并发场景 编译器的指令优化,希望在 内部 充分利用硬件资源 但是这样一来,也会带来新的并发问题,归结起来主要有三个。 由于缓存导致的可见性问题 线程切换带来的原子性问题 编译器优化带来的有序性问题 我们分别介绍这几个: 缓存导致的可见性 CPU为了平衡与内存之间的性能差异,引入了CPU缓存,这样CPU执行指令修改数据的时候就可以批量直接读写CPU缓存的内存,一个阶段后再将数据写回到内存。