本月总结

118 阅读4分钟

重启学习计划一月有余,此时停下来复盘一下学到的东西。

线程安全

线程安全,指的是:

  • 在多线程的调用下,所有线程的执行结果都在预期总和之内;或者说,多个线程可以安全地访问临界区的资源,而不会产生预期之外的错误或结果。

这个栏目下,该月学习内容如下:

基础

  1. MESI规定了最基本的CPU中缓存行交互的规范,java中线程安全的基石是JMM,定义了java中程序和内存交互的方式。链接1

工具

  1. 【笔记】sync和volatile
    • synchronized和volatile是java自带的线程同步工具,一个通过monitor指针保证原子性,一个通过读写屏障保证可见性和顺序性。
    • sync在1.8有优化,优化为:偏向锁,轻量级锁和重量级锁。
  2. JUC1 - ReentrantLock&AQS
    • 这篇内容讲的是从子类ReentrantLock的角度,分析AQS是如何维护状态的,以及是如何上锁的。
    • 简单地说,AQS维护了一个等待队列,CAS争取修改状态失败若干次数后,会休眠线程,等待当前执行线程将其唤起重新竞争。
  3. JUC2 - Lock接口和CountDownlatch
    • 这篇内容是对lock接口的分析以及对CountDownLatch类的分析。
    • CDL类也是通过AQS实现的,在实际机制上很类似于主线程在等待一个重入n次的锁,每次countdown就是重入锁归还的操作。
  4. JUC3 - Unsafe和Atomic族
    • Unsafe提供了很多java中不太建议做的事,比如内存申请分配整块搬迁,以及原生CAS的操作。
    • Atmoic类实际上是将Unsafe类中的CAS相关内容,和对应的类型实例封装在一起的实现类。

到这里其实整个JUC基本上都差不多了,大部分工具都是通过AQS来实现的,而外部对于CAS的操作则常用Atmoic类来实现。

容器

这里就是老调重弹了:

Spring

1.尝试自己来阅读Spring源码,这部分内容包括:

  • 多篇SpringBoot启动相关的内容
    • 这部分是在对Spring一无所知的情况下,试图从上到下来写的,最后烂尾了
    • 原因也很简单,Spring的组件层次很多,如果希望从上到下很容易忽略掉过多的细节导致后面无法再继续下去。

2.上面的启动流程延期之后,发现应该分解对应的流程,才能更详细、更方便地看Spring源码。这里的内容包括:

基本功

算法

每天做做算法题,复习、练习。

  • 通配符匹配
    • 这算很经典的DP题目了,也是想了很久才AC的。
  • 不同的子序列
    • 这个题目也算很经典的DP练手题目了,题解比官方的要稍好一些还有点小激动
  • 猜数字大小
    • 这个题目属于我之前完全看不懂题目的类型,现在算是看懂了如何从无状态的题目中提取状态信息了。

设计模式

设计模式可以帮助我们构建更稳定、可维护性更强、可扩展性更强的代码。

本月关于设计模式的内容如下:

设计