Java内存模型与线程

硬件间速度的差距

因为计算机各种硬件之间速度的差距实在是太大了,这严重地影响了计算机的整体效率,很多时候软件并不能够充分地利用计算机的资源,让处理器去等待内存,一种解决方案就是在内存和处理器之间引入一个缓存,来尽量减轻这个速度的差距。在多处理器系统中,往往对应着多个缓存。 ### 缓存一致性 往往这些缓存都储存着和内存一样的数据,他们互为拷贝,我们必须保证他们的数据是同步修改的。这有很多种协议来维护。 ### 乱序执行 为了更好的利用处理器的运算单元,处理器可能会对输入的代码片段进行乱序执行优化,Java虚拟机也是如此。 ### Java内存模型 Java内存模型中有两种内存,第一种是一个主内存,第二种是多个线程工作内存,线程私有。 ### 内存间的互相操作 Java内存模型有8种原子操作 lock:作用与主内存中的变量,让其变为线程独占 unlock:和lock相反 read:把主内存中的变量传输到工作内存,准备load load:把read的值放入线程工作内存的变量副本中 use:把线程工作内存中的值拿到执行引擎中 assign:从执行引擎中获得值写入工作内存 store:把工作内存中的变量传输到主内存,准备write write:把store得到的值写入主内存。 这些操作的相互执行关系很复杂,但都能推导出,这里不赘述 long和double是64位数据,Java内存模型不强制但推荐把他们也实现为原子操作 ### volatile型变量 volatile类型有两种特点,第一是保证对所有线程的可见行,即所有线程使用其前都要在工作内存中刷新他的值,但是这些操作并非原子性,所以不能保证并发安全。第二是禁止语义重排。他前面的代码不能排到他后面去,他后面的代码不能重排到他前面。 ### Java线程调度 Java有10种优先级,但是操作系统却不一定是10种,若<10则导致Java线程某些级别无差距,若>10则导致有些系统线程优先级无法使用。 ### Java线程状态 新建、运行、无限期等待(不能主动苏醒,能被唤醒)、期限等待、阻塞、结束