Java-2018技术总结 | 掘金年度征文

606 阅读5分钟

2018-个人年度技术总结及清单

  1. 技术深度改造
    1. Java基础
      1. 集合类
        1. ArrayList源码分析
          1. 为什么ArrayList查找快,其实质是实现了RandomAccess接口
          2. 初始化大小
        2. HashMap源码分析
          1. 构造函数分析(不是所有的构造函数都初始化了threshold
          2. Hash数据初始化大小(inintal_Capacity,默认16)
          3. 加载因子(loadFactor,默认0.75)
          4. 至于为什么是16和0.75,是在大量数据测试下,数学公式分析这两个值会使Hash分布更加均匀(面试时可以这么说 泊淞分布)
          5. 阈值大小(threshold,扩容函数里面初始化)
          6. 扩容函数(不仅做了扩容,还用于初始化哈希表
        3. TreeMap源码分析
          1. 二叉查找树
          2. 平衡二叉树
          3. 红黑树结构
          4. TreeMap添加删除元素
        4. ...其他
      2. 抽象类接口 的实际应用(何时使用抽象类,何时使用接口)
      3. 多线程和并发JUC包下的知识点暂时没有深入,暂列几个知识点)
        1. AQS
          1. 通过state值唤醒队列头线程
        2. CAS原理(深究原理)
          1. Java代码分析
          2. C语言代码分析
          3. 用户态-系统态(加锁),而synchronized关键字都加锁了,所以切换会消耗很多资源
          4. CPU-主存操作机制(硬件层面分析)
        3. 并发集合分析-对比jdk7和jdk8优化
        4. synchronized关键字(对象头分析)
          1. 锁升级(轻量级->自旋锁->偏向锁->重量锁)
          2. 锁膨胀(锁无法降级,导致锁膨胀)
        5. volatile关键字
          1. 保证所有线程对volatile修饰的变量访问的可见性
          2. 当一个线程对volatile修饰的变量的值进行修改,则其他线程访问的时候会得到最新的数据具体原理涉及到操作系统:讲当前处理器缓存行的数据写回到系统内存中,这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效
        6. ThreadLocal共享变量使用
        7. 线程状态
        8. 线程池
          1. 线程池与队列都满了,拒绝策略怎么定义?
        9. Object类默认控制线程状态函数分析
      4. jdk8面向函数编程
        1. lamada表达式
        2. 集合遍历
        3. stream操作-过滤、合并、遍历
        4. 创建线程
      5. JVM
        1. JVM模型
          1. 方法区(类对象元信息class-meta-info)
          2. 堆(对象)
          3. 栈(局部变量)
          4. 本地方法栈(用于C语言变量存储区)
          5. 静态区
          6. 代码区
        2. GC回收机制
          1. java采取分区回收机制,针对不同区域回收无用对象
        3. 堆分区分块
          1. 年轻代
          2. 过渡区
          3. 老年代
        4. OMM问题产生原因
        5. 双亲委托
        6. Java编译器版本
    2. 设计模式学习
      1. 单例模式
        1. 可解决内存紧张问题
        2. 使用ENUM枚举类设计单例最佳,其他都会出现单例规则破坏问题
        3. 破坏方法
          1. 反序列化
          2. 反射
      2. 模板方法模式
        1. 解决多业务,一套逻辑代码即可问题
        2. 扩展性高,测试方便,易于排除问题
      3. 工厂方法模式
        1. 使用不多,但是可以学一学
      4. 抽象工厂模式
        1. 框架设计使用多,业务中使用少
        2. 框架设计中需要生产一个对象,而对于需求的对象是不可测的,此时这个产品对象也是抽象的,那么这是生产的工厂也需要为抽象
      5. 适配器模式
        1. 这个模式是为了复用之前的接口,在之前的接口增强逻辑,为新的需求做扩展
    3. Redis生产环境问题(缓存穿透、缓存雪崩问题解决)
      1. 缓存穿透
        1. 产生原因:有人恶意通过传非正id查询,缓存肯定找不到,所以走数据库,迟早数据库被搞挂,导致系统瘫痪
        2. 解决方案:
          1. 缓存存储非正空数据,控制失效时间非常短,解决有人恶搞
          2. 业务层过滤非正id查询
      2. 缓存雪崩
        1. 产生原因:key缓存时间设置基本相同,导致一大批key同时失效,导致大量请求忽略缓存层,直接到数据库,导致数据库挂了
        2. 解决方案:
          1. 缓存时间固定值加随机时间值
      3. 遗留问题(每个数据结构没有细致去分析)
      4. String(session管理,分布式锁、限流)
      5. zset(排行榜)
      6. set(好友关系,点赞)
      7. ...
    4. Spring源码阅读分析
      1. 学习解决Spring循环依赖问题
        1. 解决方案-三层缓存
        2. 新概念-非完美对象(个人定义的词)
      2. Spring的配置文件加载、标签解析、bean加载、bean初始化
      3. SpringMVC适配器解决Controller扩展知识点
      4. Spring提供的钩子接口(这个没用到)
      5. ...
    5. Dubbo源码阅读分析
      1. 服务暴露-源码分析
      2. 服务引用-源码分析
      3. Dubbo如何整合Spring,运用到Spring的钩子接口实现工程启动服务发布与注入
      4. SPI机制进行框架扩展-源码分析
      5. Dubbo的集群调用链路、以及Mock机制、Directory服务路由、Router服务过滤、负载均衡源码分析
      6. ...
    6. Netty书籍阅读分析
      1. 传统NIO编程缺陷
      2. Netty风格编程优点
      3. 应用层网络传输载体 ByteBuf 类分析
      4. 自定义协议分析
      5. Pipeline 管道线路 与 ChannelHandler 逻辑处理器分析
      6. TCP 粘包问题产生
      7. Netty如何解决 拆包粘包 问题(使用Netty的拆包类),遗留问题就是Netty怎么做到拆包-源码分析
      8. 心跳检测机制(Netty如何做到的-源码分析)
    7. RocketMQ中间件源码分析
      1. ...
  2. 2019-年度展望
    1. RocketMQ源码分析-解决生产上问题所需
    2. Dubbo源码继续分析-学习更多框架设计模式和完成业务需求
    3. Spring源码-业务所需
    4. Netty源码-网络通信
    5. Java基础-必不可少的学习
    6. ElaticSearch搜索引擎-新知识点
    7. Elatic-Job定时任务框架-新知识点

掘金年度征文 | 2018 与我的技术之路征文活动正在进行中......