这里大部分的读者都是Java相关,所以这个强相关的技能非常重要。
Java基础则是走向Java高级的必经之路。
这里抛开基本语法不谈,重点讨论实际工作中高频次的东西。
基本容器,如:HashMap、ArrayList、HashSet、LinkedList等,不但要会用还得了解其中的原理。这样才能在不同的场景选择 的设计。
IO、NIO也是需要掌握。日常开发中大部分是在和磁盘、网络(写日志、数据库、Redis)打交道,这些都是IO的过程。
常见的设计模式如:代理、工厂、回调、构建者模式,这对开发灵活、扩展性强的应用有很大帮助。
Java多线程是非常重要的特性,日常开发很多。能理解线程模型、多线程优缺点、以及如何避免。
良好的单测习惯,很多人觉得写单测浪费时间没有意义。但正是有了单测可以提前暴露出许多问题,减少测试返工几率,提高代码质量。
良好的编程规范,这个可以参考《阿里巴巴Java开发手册》以及在它基础上优化的《唯品会Java手册》
《Java核心技术·卷I》值得推荐。多线程应用有了扎实的基础之后来谈谈多线程、并发相关的内容。
想让自己的title里加上“高级”两字肯定得经过并发的洗礼。
这里谈论的并发主要是指单应用里的场景,多应用的可以看后文的分布式内容。多线程的出现主要是为了提高CPU的利用率、任务的执行效率。但并不是用了多线程就一定能达到这样的效果,因为它同时也带来了一些问题:
上下文切换
共享资源
可见性、原子性、有序性等。
一旦使用了多线程那肯定会比单线程的程序要变得复杂和不可控,甚至使用不当还会比单线程慢。所以要考虑清楚是否真的需要多线程。
会用了之后也要考虑为啥多线程会出现那样的问题,这时就需要理解内存模型、可见性之类的知识点。
同样的解决方式又有哪些?各自的优缺点也需要掌握。
谈到多线程就不得不提并发包下面的内容java.util.concurrent。
最常用及需要掌握的有:
原子类:用于并发场景的原子操作。
队列。常用于解耦,需要了解其实现原理。
并发工具,如ConcurrentHashMap、CountDownLatch之类的工具使用以及原理。
线程池使用,以及相关原理。
锁相关内容:synchronized、ReentrantLock的使用及原理。
这一块的内容可以然我们知道写JDK大牛处理并发的思路,对我们自己编写高质量的多线程程序也有很多帮助。
推荐《Java并发编程的艺术》很好的并发入门书籍。
JVM虚拟机想要深入Java,JVM是不可或缺的。对于大部分工作1~3年的开发者来说直接接触这一些内容是比较少的。
到了3~5年这个阶段就必须得了解了,以下内容我觉得是必须要掌握的:
JVM内存划分,知道哪块内存存放哪些内容;线程安全与否;内存不够怎么处理等。
不同情况的内存溢出、栈溢出,以及定位解决方案。
分代的垃圾回收策略。
线上问题定位及相关解决方案。
一个类的加载、创建对象、垃圾回收、类卸载的整个过程。
掌握这些内容真的对实际分析问题起到巨大帮助。
对此强力推荐《深入理解Java虚拟机》,这本书反反复复看过好几遍,每个阶段阅读都有不同的收获。数据库做WEB应用开发的同学肯定要和数据库打不少交道,而且通常来说一个系统 出现瓶颈往往都是数据库,说数据库是压到系统的 一根稻草一点也不为过。
所以对数据库的掌握也是非常有必要。拿互联网用的较多的MySQL数据库为例,一些必须掌握的知识点:
索引的数据结构及原理、哪些字段应当创建索引。
针对于一个慢SQL的优化思路。
数据库水平垂直拆分的方案,需要了解业界常用的MyCAT、sharding-sphere等中间件。
常规使用可以参考《阿里巴巴Java开发手册》中的数据库章节,想要深入了解MySQL那肯定得推荐经典的《高性能MySQL》一书了。
分布式技术随着互联网的发展,传统的单体应用越来越不适合现有场景。
因此分布式技术出现了,这块涵盖的内容太多了,经验有限只能列举我日常使用到的一些内容:
首先是一些基础理论如:CAP定理,知道分布式系统会带来的一些问题以及各个应用权衡的方式。
了解近些年大热的微服务相关定义、来源以及对比,有条件的可以阅读martinfowler的原文Microservices,或者也可以搜索相关的国内翻译。
对Dubbo、SpringCloud等分布式框架的使用, 是要了解原理。
接着要对分布式带来的问题提出解决方案。如分布式锁、分布式限流、分布式事务、分布式缓存、分布式ID、消息中间件等。
也要了解一些分布式中的负载算法:权重、Hash、一致性Hash、故障转移、LRU等。
能做一个实践如:[秒杀架构实践