内存模型
内存模型属于编程语言层次规范
内存模型是在谈论并发相关事宜
线程是并发的基础设施,内存模型是编程语言给的规范,给并发编程提供的一种便利手段。
多线程编程的核心问题
线程间通信和线程间同步
共享内存
共享内存是线程或进程间通信的方式之一,就是共享数据,使用共享内存的话在多线程的场景下为了处理竞态,需要加锁,使用起来比较麻烦。go语言中并发就使用了不同的模型,go语言的channel保证同一个时间只有一个goroutine能够访问里面的数据,为开发者提供了一种优雅简单的工具,所以go原生的做法就是使用channle来通信,而不是使用共享内存来通信。go提倡“不要通过共享内存来通信,而应该通过通信来共享内存”。
Java采用的是共享内存模型,在共享内存模型中,线程间通信是隐式的,线程间同步是显式的。必须理解这个隐式。Java内存模型的抽象结构.
可执行程序在操作系统中内存布局是文本段、数据段、bss段、堆、栈(内存地址由低到高),说明Java虚拟机运行时在内存中也是这样的布局。那Java运行时数据区有方法区、虚拟机栈、本地方法栈、程序计数器、堆五个区域,这两者是没有什么关系的,Java虚拟机的布局都是建立在进程空间的堆上的。
线程
线程是操作系统层次的概念和功能,Java中的线成时和操作系统原生线成一一对应的,你在Java中使用的线程代表着一个真正操作系统原生线程,但是不是真正的原生线程。
缓存和缓冲
高速缓存是一个第三方的存储部件,加快了存储速度。缓冲是说数据填满一定大小后再处理,可以减少内核状态频繁转换以及避免速度不等设备之间等待,加快了交互速度。
为什么Java对现象基类Object中包含并发相关的方法wait()、notify()?
因为早期Java并发设计时是用synchronized关键字来实现并发大多数功能,synchronized的哲学就是隐式使用锁,让锁自动关联到方法和代码段,这样势必使锁和对象关联了起来,所以就将部分并发相关的方法直接作为所有对象的基础,同时需要注意,notify(),wait()必须在加锁代码内部,否则会抛出异常,这更加说明了他早期就是配合synchronized设计和使用的。