多核运行的环境下,由于每个CPU都有自己的读写缓存,导致的是一个线程上写的内容,不一定在另一个线程里可见。
JMM(Java memory model)做为语言级别的内存模型,为程序员提供易于理解的内存模型(通过volatie和锁机制,在编译的时候插入内存屏障,限制处理器的指令重排),同时尽量放松对处理器指令重排的限制(处理器重排指令,是为了更好利用处理器的缓存,提升效率).
Break it down:
1. volatile:
1.1 对volatile变量的读写,都等价于加了锁的操作
1.2 对volatile变量的写,相当于释放锁; 对volatile变量的读,相当与获取锁.
原因:对volatile变量的写,会把处理器写缓存的数据写到主内存
对volatile变量的读,之前会从主内存中读入数据到处理器缓存
所以保证了:如果volatile变量的写在volatile变量的读之前,那么volatile写之前包括对volatie变量的写操作,对volatile变量的读和之后的操作可见
2. 锁
通过volatile变量+CAS操作,构建出一套程序员易于编程的多线程同步工具。
(java的lock不是busy wait的,应该是sleep的。 回忆unix网络编程第二卷:进程间通信, mutex是需要不断轮询的,condition是可以睡在上面和唤醒的,可以用mutex+condition实现锁)
3. final
主要是对final变量的初始化,和包含它的构造函数,限制重排序(以加入内存屏障的方式)。以达到如果对象的引用可用,那么final变量一定是被正确初始化了的。
参考:
[url]http://ifeve.com/java-memory-model-0/[/url]
JMM(Java memory model)做为语言级别的内存模型,为程序员提供易于理解的内存模型(通过volatie和锁机制,在编译的时候插入内存屏障,限制处理器的指令重排),同时尽量放松对处理器指令重排的限制(处理器重排指令,是为了更好利用处理器的缓存,提升效率).
Break it down:
1. volatile:
1.1 对volatile变量的读写,都等价于加了锁的操作
1.2 对volatile变量的写,相当于释放锁; 对volatile变量的读,相当与获取锁.
原因:对volatile变量的写,会把处理器写缓存的数据写到主内存
对volatile变量的读,之前会从主内存中读入数据到处理器缓存
所以保证了:如果volatile变量的写在volatile变量的读之前,那么volatile写之前包括对volatie变量的写操作,对volatile变量的读和之后的操作可见
2. 锁
通过volatile变量+CAS操作,构建出一套程序员易于编程的多线程同步工具。
(java的lock不是busy wait的,应该是sleep的。 回忆unix网络编程第二卷:进程间通信, mutex是需要不断轮询的,condition是可以睡在上面和唤醒的,可以用mutex+condition实现锁)
3. final
主要是对final变量的初始化,和包含它的构造函数,限制重排序(以加入内存屏障的方式)。以达到如果对象的引用可用,那么final变量一定是被正确初始化了的。
参考:
[url]http://ifeve.com/java-memory-model-0/[/url]