重启学习计划一月有余,此时停下来复盘一下学到的东西。
线程安全
线程安全,指的是:
- 在多线程的调用下,所有线程的执行结果都在预期总和之内;或者说,多个线程可以安全地访问临界区的资源,而不会产生预期之外的错误或结果。
这个栏目下,该月学习内容如下:
基础
- MESI规定了最基本的CPU中缓存行交互的规范,java中线程安全的基石是JMM,定义了java中程序和内存交互的方式。链接1
工具
- 【笔记】sync和volatile
- synchronized和volatile是java自带的线程同步工具,一个通过monitor指针保证原子性,一个通过读写屏障保证可见性和顺序性。
- sync在1.8有优化,优化为:偏向锁,轻量级锁和重量级锁。
- JUC1 - ReentrantLock&AQS
- 这篇内容讲的是从子类ReentrantLock的角度,分析AQS是如何维护状态的,以及是如何上锁的。
- 简单地说,AQS维护了一个等待队列,CAS争取修改状态失败若干次数后,会休眠线程,等待当前执行线程将其唤起重新竞争。
- JUC2 - Lock接口和CountDownlatch
- 这篇内容是对lock接口的分析以及对CountDownLatch类的分析。
- CDL类也是通过AQS实现的,在实际机制上很类似于主线程在等待一个重入n次的锁,每次countdown就是重入锁归还的操作。
- JUC3 - Unsafe和Atomic族
- Unsafe提供了很多java中不太建议做的事,比如内存申请分配整块搬迁,以及原生CAS的操作。
- Atmoic类实际上是将Unsafe类中的CAS相关内容,和对应的类型实例封装在一起的实现类。
到这里其实整个JUC基本上都差不多了,大部分工具都是通过AQS来实现的,而外部对于CAS的操作则常用Atmoic类来实现。
容器
这里就是老调重弹了:
- hashMap一些经典问题hashMap问题速记
- ConcurrentHashMap问题速记
Spring
1.尝试自己来阅读Spring源码,这部分内容包括:
- 多篇SpringBoot启动相关的内容
- 这部分是在对Spring一无所知的情况下,试图从上到下来写的,最后烂尾了
- 原因也很简单,Spring的组件层次很多,如果希望从上到下很容易忽略掉过多的细节导致后面无法再继续下去。
2.上面的启动流程延期之后,发现应该分解对应的流程,才能更详细、更方便地看Spring源码。这里的内容包括:
-
Spring中bean的生命流程
- bean生命流程1 - 扫描以及生成BeanDefinition
- bean生命流程2 - 获取bean
- bean生命流程3 - 构造bean(1)
- bean生命流程4 - 构造bean(2)
- bean生命流程5 - 剩余事项
针对上面bean生命周期中所忽略的内容,下面及时做出补充:
-
依赖注入:
-
循环依赖:
-
推断构造方法:
-
还有开了一半头的自动装配:
基本功
算法
每天做做算法题,复习、练习。
- 通配符匹配
- 这算很经典的DP题目了,也是想了很久才AC的。
- 不同的子序列
- 这个题目也算很经典的DP练手题目了,题解比官方的要稍好一些还有点小激动
- 猜数字大小
- 这个题目属于我之前完全看不懂题目的类型,现在算是看懂了如何从无状态的题目中提取状态信息了。
设计模式
设计模式可以帮助我们构建更稳定、可维护性更强、可扩展性更强的代码。
本月关于设计模式的内容如下:
- 设计模式【2】 - 桥接,外观,享元
- 从设计模式到DDD
- 看了淘系技术发的DDD落地实践,感觉其实就是用了各种设计模式,来让系统中各个领域、层级之间的界限更明确,做到小粒度的解耦,因此试着自己来逆推一下从设计模式中如何倒推到DDD中。
设计
-
幂等性设计
简单点来说,幂等性设计的原理,最终落地都需要靠唯一键加锁、乐观的方式去匹配的。