多线程
收录一篇文章,慢慢研究
https://www.jianshu.com/p/d1eec344b3a0
先来看看线程状态
![](http://upload-images.jianshu.io/upload_images/6441399-88d5545f785fbe13.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/778/format/webp)
有了线程,那么线程是运行在哪里的,还有线程的所持有的资源又有哪些那?哪些是共享的,哪些是私有的:
![](http://upload-images.jianshu.io/upload_images/6441399-7fd16d4028f3c98d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
脑图:
![](http://upload-images.jianshu.io/upload_images/6441399-537417c4fa97ce64.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
那么有了线程就有多线程,多线程的安全优势怎么回事?怎么保证的那?
看到了吗? CPU 不相信内存能跟得上自动处理速度,自己整了三级缓存,这就导致了,缓存不一致问题的出现,和我们的多级缓存机制是多么的像啊? 怎么破那?
如下图:
![](http://upload-images.jianshu.io/upload_images/6441399-c0f9d286b30c7ea2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
![](http://upload-images.jianshu.io/upload_images/6441399-d1d93a121b71f9eb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/911/format/webp)
于是又出现了缓存一致性标准:
实际上,线程操作堆中共享对象数据时并不是直接操作对象所在的那块内存,这里称之为主内存;
而是将对象拷贝到线程私有的工作内存中进行更新,完成后再将最新的数据值同步回主内存,
而多个线程在同一时刻将一个对象的值改得七七八八,然后再同时同步给对象所在的内存区域,那么以谁更新的为准就成了问题了。
为了防止这种情况出现,Java提供了同步机制,确保各个线程按照一定的机制同一时刻只能运行一个线程更新主内存的值。
注意,这里所讲的主内存、工作内存与Java内存区域中的Java堆、栈内存、方法区等并不是同一个层次的内存划分。
如果勉强类比,从变量、主内存、工作内存的定义来看,主内存主要对应于Java堆中对象实例数据部分,
而工作内存则对应于虚拟机栈中使用的部分内存区域;从更低层次类比,主内存就直接对应于物理硬件的内存,
而为了获取更好的运行速度,虚拟机(甚至是硬件系统本身的优化措施)可能会让内存优先存储于寄存器和高速缓存中,
因为程序运行时主要访问读写的是工作内存。
![](http://upload-images.jianshu.io/upload_images/6441399-ea2274525d9f325e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
作者:神仙苏醒
链接:https://www.jianshu.com/p/d1eec344b3a0
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。