并发编程与多线程编程的区别、多线程编程分析、Volatile关键字的特性简析

       上一篇讲了 jvm 的的虚拟机与内存交互的八大基本操作、jvm 的遵守的8大规则;以上,实际点来说,就是分析多线程的原理,接下给我也给正在阅读的你分析下,在多线程编程的环境下,怎么保障数据的原子性、可见性、有序性

       三个特征:原子性、可见性、有序性 ,多线程编程主要围绕着这三个的特性展开的;

       额外补充,引出来一个面试点:多线程编程 以及 并发编程 的区别,这个是我之前面试的时候被面试官问到的问题,当时支支吾吾的自己也相对模糊:并发编程就是大量的数据同时访问一个接口或者一个方法,举个生活的例子,早高峰进地铁站,一群人蜂拥进站,这可以认为是一种并发,他们要做的事情是一样的:进站。  那么多线程是什么,如果地铁站的一个闸机口认为是一个线程,那么开放多个闸机口就可以认为是多线程。  还有补充一点:就是多线程编程并不是只在并发的时候用到,它是为了避免一个线程的过载影像效率,多线程也可以将单任务截取为多段同时进行,这种情况的多线程并不是为了处理并发。好比植树节种树,每个人相当于一个线程,很多人相当于多个线程,大家同时种树只是为了提高效率。

       广告完毕,立马回来,,,,

       首先先理解下这三个特性:什么是原子性,可见性,有序性;其中原子性的概念跟数据的ACID概念中得原子性同一个概念,

原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

有序性:程序执行的顺序按照代码的先后顺序执行。

于是乎,来到了 volatile 关键字 和  synchronized

Volatile的特性,Volatile的作用和synchronized相同,但是和synchronized相比,更轻量。其特性主要有如下两点:

  1. 保证此变量对所有线程的可见性

啥意思呢?指当一个线程修改了这个变量的值,新值对于其他线程来说是立即可知的。而普通变量做不到这一点,普通变量的值在线程间传递均需要通过主内存来完成,比如线程A修改了一个普通变量的值,然后向主内存进行回写,另外一条线程B在线程A回写完成了之后再从主内存进行读取操作,新变量值才会对线程B可见。

     2.禁止指令重排序优化

因为指令重排序会干扰程序的并发执行。


关于这个Volatile 关键字以及 synchronize的分析需要看完多线程编程,才能理解通透,所以暂时不往下继续分析了,先扩展下宽度;接下来进行分析下jvm的write  以及 reload 操作;

你可能感兴趣的:(JVM虚拟机)