开头
Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶。Spring更是避免了重复造轮子的工作并跟随着互联网行业的发展做出不断的更新,很多研发人员把spring看作心目中最好的Java项目,没有之一。
**可以毫不夸张的说,Spring重新定义了Java,**所以这是重点也是难点,工作中必须会,面试时肯定考,不过很多人在面试的时候在简历上写着熟悉Spring,但也不过只是会用SSM,在这个基础上做crud罢了,对于Spring全家桶里面其他技术点真的有所掌握吗?
Spring系列包含非常多的项目,可以满足Java开发中的方方面面,先来看下常用框架的知识点汇总:
本文分享的内容是:阿里“重推”的Spring+Spring Boot+Spring Cloud Alibaba学习手册,如果你拿到这份宝典认真的看完后,那你对于Spring的掌握绝对不是“熟悉”的程度,接下来不多哔哔,直接上干货!(完整版内容请阅读至文末获取!)
并发编程三大特性
原子性
一个操作或者多次操作,要么所有的操作全部都得到执行并且不会受到任何因素的干扰而中断,要么所有的操作都执行,要么都不执行。
对于基本数据类型的访问,读写都是原子性的【long和double可能例外】。
如果需要更大范围的原子性保证,可以使用synchronized关键字满足。
可见性
当一个变量对共享变量进行了修改,另外的线程都能立即看到修改后的最新值。
volatile
保证共享变量可见性,除此之外,synchronized
和final
都可以 实现可见性。
synchronized
:对一个变量执行unclock之前,必须先把此变量同步回主内存中。
final
:被final修饰的字段在构造器中一旦被初始化完成,并且构造器没有把this的引用传递出去,其他线程中就能够看见final字段的值。
有序性
即程序执行的顺序按照代码的先后顺序执行【由于指令重排序的存在,Java 在编译器以及运行期间对输入代码进行优化,代码的执行顺序未必就是编写代码时候的顺序】,volatile
通过禁止指令重排序保证有序性,除此之外,synchronized
关键字也可以保证有序性,由【一个变量在同一时刻只允许一条线程对其进行lock操作】这条规则获得。
CPU缓存模型是什么
高速缓存为何出现?
计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的**临时数据是存放在主存(物理内存)**当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行