主要讲解Java的并发编程的基础知识,包括原子性、可见性、有序性,以及内存模型JMM。
Java系列说明
从这篇文章开始,我就要正式开始学习Java了,之所以说是从现在开始,是因为前两个月一直在纠结是否转技术栈(细心的同学可以发现,我之前写的文章,其实和Java并没有什么关系),现在已经想清楚了,既然确定要转Java技术栈,那就踏踏实实从头开始学吧。
目前的我,可以说是Java小白,刚转团队不久,也就接触了2个月的Java,代码没写几行,既然发现自己Java很菜,那就要列个学习计划,将这块知识好好补补。目前给自己定了一年的学习计划,希望能通过一年的学习,将Java的技能从初阶直接晋级到高阶水平,可能有同学会问“我学习Java都几年的,都还是中级水平,你花一年就可以晋级到高阶?”,我只想说,我想试试,毕竟工作这么长时间,也掌握了一定的学习方法,相信跟着自己的学习节奏走,应该不会离目标太远,今天立个Flag,希望一年后不会啪啪打脸【捂脸】~~
Java系列的内容主要包括并发编程、Spring、SpringBoost、SpringCloud、Tomcat、MyBatis、Dubbo和虚拟机,然后一些经典书籍的读书笔记等,当这些都掌握到一定深度后,我想我的Java技能应该也就差不多了。
最后想说的是,Java很多系列文章,很大一部分是内容整理,之所以要通过文章的形式再写一遍,是因为看过的内容,如果自己不整理一遍,或者不让程序跑跑,很容易遗忘,所以写文章其实不是目的,主要是重新整理和回顾学习内容的过程,一方面印象深刻,另一方面,也便于自己后续查阅。
今天废话有点多,我们就从并发编程开始吧!
并发编程基本概念
原子性
一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
原子性是拒绝多线程操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作。Java中的原子性操作包括:
- 基本类型的读取和赋值操作,且赋值必须是值赋给变量,变量之间的相互赋值不是原子性操作;
- 所有引用reference的赋值操作;
- java.concurrent.Atomic.* 包中所有类的一切操作。
可见性
指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
在多线程环境下,一个线程对共享变量的操作对其他线程是不可见的。Java提供了volatile来保证可见性,当一个变量被volatile修饰后,表示着线程本地内存无效,当一个线程修改共享变量后他会立即被更新到主内存中,其他线程读取共享变量时,会直接从主内存中读取。当然,synchronize和Lock都可以保证可见性。synchronized和Lock能保证同一时刻只有一个线程获取...
1 条评论
回复