言尽于此,完结
无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。
- 第一,设计模式能让专业人之间交流方便,如下:
程序员A:这里我用了XXX设计模式
程序员B:那我大致了解你程序的设计思路了
- 第二,易维护
项目经理:今天客户有这样一个需求…
程序员:明白了,这里我使用了XXX设计模式,所以改起来很快
- 第三,设计模式是编程经验的总结
程序员A:B,你怎么想到要这样去构建你的代码
程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题
- 第四,学习设计模式并不是必须的
程序员A:B,你这段代码使用的是XXX设计模式对吗?
程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的
从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!
搜集费时费力,能看到此处的都是真爱!
-
读final域的重排序规则
-
final域的引用类型
-
为什么final引用不能从构造函数内溢出?即发生重排序
-
final的底层实现
final这个修饰可以加在类、方法、变量上
-
加在类上面是让类不可以被继承,而且里面的方法全部默认为final修饰
-
加在方法上是让该方法不可以被子类重写
-
加在变量上,表示该变量变为常量,而且必须进行初始化
但其实final也是可以解决一些并发重排序问题的。
final域也有自己的重排序规则
-
在构造函数来对一个final域进行写入,与之后把这个构造对象的引用赋值给一个引用变量,这两个操作是不可以发生重排序的,即初始化不可以与引用赋值发生重排序,跟volatile是一样的
-
第一次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间是不能发生重排序的
这两个规则分别对应final的读写的重排序规则
写final域的重排序规则
写final域的重排序规则其实就是上面的,初始化不可以与引用赋值发生重排序,必须先初始化,然后再进行引用赋值,但如果对于普通变量来说,也就是普通域,很可能会发生这两个步骤的重排序
这个规则可以确保,在对象引用为任意线程可见之时,对应的final域已经被正确初始化了
写final域的重排序规则是使用内存屏障来实现的
编译器会在final域的写之后,构造函数return之前,插入一个StoreStore屏障,这个屏障禁止了处理器将final域的写命令重排序到return之后,也就是构造函数之外
读final域的重排序规则
读final域的重排序规则就是,初次读对象引用与初次读对象里面的final引用是不可以发生重排序的,必须先读对象引用然后再读final引用
这个规则可以确保,在读一个final域之前,一定会先读包含这个final域的对象的引用,这是因为final域是依赖于对象的
读final域的重排序规则也是使用内存屏障来实现的
编译器会在都final域操作的前面插入一个LoadLoad屏障,确保前面如果有初次读对象操作时,要先读对象,然后再读final域
总结
在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了
+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**