其实关于线程的使用,之前已经写过博客讲解过这部分的内容:http://www.cnblogs.com/deman/category/621531.htmlJVM里面关于多线程的部分,主要是多线程是如何实现的,以及高效并发。1.Java内存模型CPU在运行的时候,不可能把所有的东西 ...
其实关于线程的使用,之前已经写过博客讲解过这部分的内容:
http://www.cnblogs.com/deman/category/621531.html
JVM里面关于多线程的部分,主要是多线程是如何实现的,以及高效并发。
CPU在运行的时候,不可能把所有的东西都放在寄存器里面,所有需要使用内存。这个内存就是我们知道的那个内存。
但是实际情况是,内存的读写速度于CPU的指令操作差了几个数量级。所以为了跟高效的使用CPU,就有高速缓存这么一个东西。
以下是Intel 酷睿i7 6700K参数:
三级缓存8MB。
百度以下就知道这个“三级缓存”是个神马东西。
而java的内存模型与物理结构非常相识,有一个主内存,对应我们计算机的内存,还有每个线程都有一个工作内存,对应于高速缓存。
可以看到,每个java线程都有自己独立的内存。
这也就解释了,为什么不同线程,如果不同步的话,变量就会有并发的问题。
这里关于工作内存和主内存的拷贝问题,是由JVM实现的,并不是正真意义上的内存复制。
2.内存间操作
1)lock,作用于主内存变量,把一个变量标记为线程独占。
2)unlock,与lock正相反。
3)read,作用于主内存变量,它把一个变量从主内存传输到工作内存中。
4)load,作用于工作内存变量,把从read里面获取的变量放入工作内存的变量副本中。
5)use,作用于工作内存变量,把变量的值传递给执行引擎。
6)assign,作用于工作内存变量,把执行引擎的值 复制给工作内存变量。同use相反
7)store,作用于工作内存变量,把工作内存变量传输到主内存中。
8)write,作用于主内存变量,把store获取的值,写入到住内存中的变量。
read & load, store & write成对出现。
还有其他一些规则,目的就是保证内存变量的 操作合理,有序。
3.并发编程的三个概念
1)原子性
计一个操作要么全部执行,要么不执行,不能被打断。
jvm通过lock & unlock指令来保证代码的原子性。反映到java代码就是synchronized.
2)可见性
可见性是指当一个程序修改变量以后,其他程序可以立即获得这个修改的值。
3)有序性
JVM在编译java代码,优化的时候,会重现排布java代码的顺序。但是会保证结果时候java代码的顺序结果一致的。
public Runnable mRun1 = new Runnable() {上面,3,4两行语句顺序是乱序的,6,7也是,但是5 一定在3,4之后运行。 也就是5的执行为止不变,而且,3,4 不能和6,7互换执行顺序。这就是volatile有限的有序性。
参考:
http://www.cnblogs.com/dolphin0520/p/3920373.html
《深入理解java虚拟机》周志明
原标题:深入理解java虚拟机(6)
关键词:JAVA
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。