多线程

开篇

        在聊多线程之前,先讨论下计算机的CPU和内存。计算机的世界里,CPU是一个大脑,CPU的计算速度很快,而内存的数据传输速度是有限的,远远比不上CPU,为了能提高CPU的速度,CPU内部有L1,L2,L3等高速缓存,这部分的缓存速度十分快。所以计算机进行运算时,会把内存的数据放入高速缓存,然后CPU和高速缓存进行数据交换。也就是说CPU的计算过程中,始终是以高速缓存的数据为准的。

多线程

 

 

线程的生命周期

多线程

 

        Java的多线程:java里创建线程的方式有很多种,有new Thread,还有无返回值的Runnable,有返回值的Callable,然后又返回值的Callable较为复杂,所以配套使用的有Future,FutureTask。最后还有线程池的方式来创建线程等。

在Java里,当new Thread时,线程已经创建了,但这只是JVM层面上的,创建一个线程,需要初始化线程需要的资源,栈内存,变量空间,而这些东西都是操作系统给完成的。jvm调用线程的start方法时,才会真正的去创建线程需要的这些资源。

线程中,线程又区分了,前台线程和后台线程,其实主要关注后台线程,即守护线程,这种线程,主线程运行结束后,守护线程也会结束。如果是普通的子线程的话,即使主线程运行结束后,子线程依旧会继续运行。

     说道了多线程,多线程中有两个问题:线程互斥和通信。那么线程之间为什么要互斥呢,原因在于CPU的高速缓存结构,当多个线程同时对一块的区域进行修改时,尤其是依赖原先数据的状态的操作,比如 i - -。由于CPU运行时,是与高速缓存打交道,即使对相同变量,另一个线程改变了该变量的值,其他线程也是获取不到的。

由此线程之间的通信有一种高速缓存协议MESI。java里有volatile关键字,该关键字打通了多线程之间的变量不可见问题。即,一个变量被另一个线程修改后,这个修改对另一个线程是可见的。但是volatile是不能保证线程的安全性的。即线程要对该变量写时,必须读取到最新值,然而读取到最新值后,可能立马就变成旧值了,这是一个死循环的问题。

线程的安全性就需要用到syncinazed。。。待后补充

 

         

 

上一篇:Redis的过期删除策略(和内存淘汰机制)-转


下一篇:自研CPU架构与品牌