|
| 1 | +# 作业注意事项 |
| 2 | + |
| 3 | + |
| 4 | +> 课程内容: |
| 5 | +
|
| 6 | +课程1、Java中的多线程与并发编程,某一线公司技术专家任富飞。 |
| 7 | +Part1:11-22,周一,18:45-19:45,主要内容: |
| 8 | + |
| 9 | +Java多线程原理、各种锁的机制和应用(重量级锁、轻量级锁,可重入锁,偏向锁,公平锁,自旋锁,读写锁,乐观锁等)、四种线程池的原理、类型、配置参数和经验,Spring中线程池的应用,几种常用原子类的原理和使用场景。 |
| 10 | + |
| 11 | +Part2:11-26,周五,18:45-19:45,主要内容:AQS原理,三种常用并发工具类(CountdownLatch/Semaphore/CyclicBarrier)使用场景示例,线程安全编程和优化经验。 |
| 12 | + |
| 13 | +课程2、JVM的体系发展与优化经验,长亮科技北京平台团队负责人秦金卫。 |
| 14 | +Part1:11-29,周一,18:45-19:45,主要内容:JVM基础(字节码、内存模型、类加载器),各种不同的GC(串行GC、并行GC、CMS、G1、ZGC)的基本原理、常用参数和分析经验。 |
| 15 | +Part2:12-03,周五,18:45-19:45,主要内容:常见JVM命令行工具、可视化工具,以及高级工具的使用,通过GC日志、线程堆栈、飞行记录以及可视化分析等方式,实现JVM运行状态的分析和优化,常见的JVM问题排查。 |
| 16 | + |
| 17 | +课程3:事务原理与Spring事务机制,京东科技技术专家、Apache Shenyu项目负责人、《分布式事务原理与实战》作者肖宇。 |
| 18 | +Part1:12-06,周一,18:45-19:45,主要内容:关系数据库的事务机制和隔离级别(读未提交/读已提交/可重复读/串行化),Spring TX事务管理器的功能特性、使用方式。 |
| 19 | +Part2:12-10,周五,18:45-19:45,主要内容:Spring TX事务管理器的原理设计,相关的API和注解,传播特性,跟其他框架的集成,以及常见问题处理经验。 |
| 20 | + |
| 21 | +课程4、网络编程NIO与Netty实践,长亮科技北京平台团队负责人秦金卫。 |
| 22 | +Part1:12-13,周一,18:45-19:45,主要内容:Java网络编程模型,BIO/NIO/AIO,Reactor/Proactor网络模型,select/epoll机制; |
| 23 | +Part2:12-17,周五,18:45-19:45,主要内容:Netty的基本原理、常见用法与网络编程优化经验,Channel/EventLoop/Handler/Adapter |
| 24 | + |
| 25 | + |
| 26 | +> 批阅原则: |
| 27 | +
|
| 28 | +- 1. 认可与表扬认真学习的同学, 尽量给与正面反馈, 加油打气。 |
| 29 | +- 2. 对一些问题和不足进行友善的提示, 都是成年人, 大家都要面子。 |
| 30 | +- 3. 引导同学们学习各种进阶知识,拓展知识点。 |
| 31 | + |
| 32 | + |
| 33 | +简介: |
| 34 | + |
| 35 | +``` |
| 36 | +铁锚:系统架构师,Java性能调优专家。 |
| 37 | +CSDN博客专家: https://renfufei.blog.csdn.net/ |
| 38 | +热爱程序开发和设计; 积极应对各种情境和挑战; |
| 39 | +喜欢钻研新技术, 闲暇时喜欢翻译和分析英文文档/技术博客。 |
| 40 | +技术文章翻译仓库: https://github.com/cncounter/translation/ |
| 41 | +``` |
| 42 | + |
| 43 | + |
| 44 | + |
| 45 | +## 1周 |
| 46 | + |
| 47 | + |
| 48 | +提示: |
| 49 | +- 尝试自己从头绘制一幅图形,完善后向自己的同事或者朋友介绍,加深自己的印象和理解 |
| 50 | +- JDK7及之前的版本是永久代, 对应到JDK8及以后是Meta区, class信息保存着方法区之中。 |
| 51 | +- 常量池位于方法区/Meta区之中, Mata区归属于非堆内存(Non-Heap),不是堆外内存,也不是直接内存 |
| 52 | +- CCS是开启指针压缩时才有的, 关闭指针压缩则此空间的大小为0 |
| 53 | +- 直接内存(Direct)属于堆外内存,不属于非堆 |
| 54 | +- 堆外内存可简单划分为(Direct, Native), 本次作业对应的所有内存区域都在JVM进程内部 |
| 55 | +- JIT编译后的机器代码缓存到 code cache/非堆之中; |
| 56 | +- `-Xmx` 和 `-Xms` 设置的是整个堆内存的大小,不是老年代。 |
| 57 | +- 和年轻代(young/nursery)不一样,新生代实际上是 Eden 区, 由 `-Xmn` 与存活区的比例来控制 |
| 58 | +- 栈内存不在堆内存之中,也不属于堆外内存,是一个独立的部分。 |
| 59 | +- 注意区分线程栈以及内部的栈帧结构; `-Xss` 控制单个线程的栈空间最大大小 |
| 60 | +- 编码风格: 建议增加中间变量,增加可读性,可读性和可维护性是构建大型复杂系统的基石。 |
| 61 | +- 注意关闭输入输出流,最好是谁控制着打开的,就由谁在同一个方法内将其关闭。 |
| 62 | +- 在开发中可以打断点调试,查看class加载时的调用栈和调用关系。 |
| 63 | +- 作业参考链接: https://github.com/JavaCourse00/JavaCourseCodes/tree/main/01jvm |
| 64 | +- 《Java资料链接汇总》: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 65 | +- 秦老师推荐书单: <https://kimmking.github.io/> |
| 66 | +- 铁锚的翻译仓库: <https://github.com/cncounter/translation/> |
| 67 | + |
| 68 | + |
| 69 | + |
| 70 | +## 2周 |
| 71 | + |
| 72 | +认真完成作业和整理笔记 |
| 73 | + |
| 74 | +- 在finally中关闭输入输出流是一个好习惯; 每次提交认真写提交日志也是一个好习惯。 |
| 75 | +- 分辨HTTP1.0与HTTP1.1的区别; |
| 76 | +- 可以尝试分析G1中混合模式 mixed GC的威力; 选择哪种垃圾收集器,主要考虑的是业务特征(实时/非实时),跟内存大小关系并不太大。 |
| 77 | +- 与外部系统的交互,在允许的情况下,最好是输出详细的交互日志, 包括: [uri,请求参数/body,响应信息,耗时信息]等等。 |
| 78 | +- 性能测试时需要排除各种干扰,只改变单个变量然后进行对比,例如: 客户端线程数,并发连接数/用户数,去除随机数的随机性(指定random种子)等等。 |
| 79 | +- 编码风格: 建议增加中间变量,增加可读性,可读性和可维护性是构建大型复杂系统的基石。 |
| 80 | +- 建议: 适当使用一些通用工具类,例如 apache的commons-io等等,里面的 IOUtils之类的工具很好用。 |
| 81 | +- 建议:趁机使用和学习 markdown 文件,做好目录和链接引用,在互联网上很方便,而且可以导出为各种格式。常用工具: Typora 等。 |
| 82 | + |
| 83 | +- 往期优秀作业链接: <https://github.com/lw1243925457/JAVA-000> |
| 84 | +- 作业参考链接: <https://github.com/JavaCourse00/JavaCourseCodes/tree/main/02nio> |
| 85 | +- 《Java资料链接汇总》: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 86 | +- 秦老师推荐书单: <https://kimmking.github.io/> |
| 87 | +- 铁锚的翻译仓库: <https://github.com/cncounter/translation/> 【可以找感兴趣的技术文章看看】 |
| 88 | + |
| 89 | + |
| 90 | + |
| 91 | + |
| 92 | + |
| 93 | +## 3周 |
| 94 | + |
| 95 | + |
| 96 | +提示: |
| 97 | + |
| 98 | +- 梳理一下网关需要执行的操作和处理逻辑,对比一下Nginx是怎么处理的。 |
| 99 | +- 使用自己的包名, 来标识自己的作品 |
| 100 | +- 通过 .gitignore 文件来忽略某些文件。 |
| 101 | +- 性能测试时需要排除各种干扰,只改变单个因素, 然后进行对比,例如: 客户端线程数,并发连接数/用户数等等。 |
| 102 | +- 不要用实例变量来存储某些信息,避免多线程环境下的出错,以及多次请求互相污染。 |
| 103 | +- 适当增加必要的注释来增加可读性,说明某段代码的作用和实现逻辑,但不要太多或者太少 ^_^ |
| 104 | +- 响应头之中也可以加上某些 X-开始的header,方便调试和追踪,更像一个网关 |
| 105 | +- 响应消息写入完成后, 记得 flush 和 close。推荐在finally中关闭,避免中间过程抛异常导致资源不关闭,引发内存泄漏, 在高并发场景中造成问题。 |
| 106 | +- 可以了解一下 ByteArrayOutputStream,挺好用. |
| 107 | +- 注意Java输入流的特征,以及基于buffer的读取和写入方法, 不要写多了, 也不要读漏了. |
| 108 | +- 注意区分 HTTP1.0 和 HTTP1.1的差异 |
| 109 | +- 所有使用 getBytes 和String相关的方法都需要指定具体的编码, 避免默认语言问题。 |
| 110 | + |
| 111 | +- 往期优秀作业链接: <https://github.com/lw1243925457/JAVA-000> |
| 112 | +- 《Java资料链接汇总》: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 113 | +- 秦老师推荐书单: <https://kimmking.github.io/> |
| 114 | +- 铁锚的技术文章翻译: <https://github.com/cncounter/translation/> |
| 115 | + |
| 116 | + |
| 117 | + |
| 118 | +## 4周 |
| 119 | + |
| 120 | +笔记整理。 |
| 121 | + |
| 122 | +提示: |
| 123 | +- 请复习创建线程池的方法, 分辨 cached 方式的线程池是先加队列还是先创将cache线程? 提示: core,queue,cache,reject |
| 124 | +- 多线程代码中,共享状态的变量需要特殊处理,比如使用 volatile 来强制从内存读取最新值,或者直接使用原子类来保存。 |
| 125 | +- 思考各种线程协同方式的本质是什么? |
| 126 | +- 想想怎么让线程处于各种不同的状态, 以及怎么获取这些状态信息 |
| 127 | +- 线程最重要的属性是哪些? |
| 128 | +- 尝试使用反射方式在main方法中将这些方法全部调用起来 |
| 129 | +- 往期优秀作业链接: <https://github.com/lw1243925457/JAVA-000> |
| 130 | +- 《Java资料链接汇总》: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 131 | +- 秦老师推荐书单: <https://kimmking.github.io/> |
| 132 | +- 铁锚的技术文章翻译: <https://github.com/cncounter/translation/> |
| 133 | + |
| 134 | +并发相关的面试题,在【第一课】【预习资料以及环境准备】里面的压缩包之中。 |
| 135 | + |
| 136 | + |
| 137 | + |
| 138 | + |
| 139 | +## 5周 |
| 140 | + |
| 141 | + |
| 142 | +提示: |
| 143 | +- 枚举实际上是可以通过反射往里面加东西的,当然,在编译期间不可见,属于运行时hack修改。 |
| 144 | +- 反编译工具可以使用: jd-gui, 或者 jclasslib |
| 145 | +- 往期优秀作业链接: <https://github.com/lw1243925457/JAVA-000> |
| 146 | +- 《Java资料链接汇总》: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 147 | +- 秦老师推荐书单: <https://kimmking.github.io/> |
| 148 | +- 深入系列: InnoDB存储引擎: <https://github.com/cncounter/translation/tree/master/tiemao_2020/44_innodb-storage-engine> |
| 149 | + |
| 150 | + |
| 151 | + |
| 152 | + |
| 153 | +## 6 周 |
| 154 | + |
| 155 | +提示: |
| 156 | +- 建议: 在Table级别使用 utf8mb4 字符集 |
| 157 | +- 设计合理的SQL语句和注释,并通过Git形成版本化。 |
| 158 | +- 使用BIGINT来存储Long类型的时间戳timeMillis,减少对时区的依赖。 |
| 159 | +- 可以根据业务需要, 增加联合索引。 |
| 160 | +- 可以结合自己在网上购物的经历, 思考如何设计订单表。 |
| 161 | +- 往期优秀作业链接: <https://github.com/lw1243925457/JAVA-000> |
| 162 | +- 《Java资料链接汇总》: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 163 | +- [InnoDB的锁和事务模型](https://github.com/cncounter/translation/blob/master/tiemao_2020/44_innodb-storage-engine/14.7_innodb-locking-transaction-model_CN.md) |
| 164 | + |
| 165 | + |
| 166 | +通过上周的课程学习, 经过本次作业实践, 请思考以下问题: |
| 167 | +1. MySQL数据库中, int(2) 和 int(10) 有什么区别? |
| 168 | +2. 订单表中的【创建时间】字段采用以下类型, 各自的优缺点是什么? |
| 169 | +- A、 datetime |
| 170 | +- B、 timestamp |
| 171 | +- C、 bigint |
| 172 | +- D、 int |
| 173 | +- E、 varchar |
| 174 | + |
| 175 | + |
| 176 | +## 7周 |
| 177 | + |
| 178 | + |
| 179 | +提示: |
| 180 | +0. 想一想限制数据库TPS的瓶颈点有哪些? 分析整个请求执行链路上的各个环节, 并尝试解决各种环节下的瓶颈。 |
| 181 | +1. 可以使用aop来做动态切换,根据sql类型来做数据源切换不能很好支持强制走主库查询的情况 |
| 182 | +2. 注解时考虑使用数据源名称,而不是master-slave;应用内可能有多个数据库组(比如账号数据一套主从,订单数据一套主从) |
| 183 | +3. 考虑多个从库的情况 |
| 184 | +4. 注解加到mapper(dao层),而不是service层;具体实现可以考虑各种情景确定是否采用注解赋予的建议。 |
| 185 | +5. aop可以看下AbstractPointcutAdvisor |
| 186 | +6. 《Java资料链接汇总》: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 187 | +7. 可以参考的作业实现: |
| 188 | + - <https://github.com/CHImPB/JAVA-000/tree/main/Week_07> |
| 189 | + - <https://github.com/ykthree/JAVA-000/tree/main/Week_07> |
| 190 | +8. 秦老师推荐书单: <https://kimmking.github.io/> |
| 191 | +9. 铁锚的技术文章翻译: <https://github.com/cncounter/translation/> |
| 192 | + |
| 193 | + |
| 194 | + |
| 195 | +## 8周 |
| 196 | + |
| 197 | + |
| 198 | +提示: |
| 199 | + |
| 200 | +- 想想什么情况下适合使用分表,什么情况下适合使用分库,各有什么优缺点? |
| 201 | +- 注意分库与分表的表达式, 避免分布不均匀或者导致空表 |
| 202 | +- 适当增减注释来说明每一块代码的意图。 |
| 203 | +- 《Java资料链接汇总》: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 204 | +- 秦老师推荐书单: <https://kimmking.github.io/> |
| 205 | +- 铁锚的技术文章翻译: <https://github.com/cncounter/translation/> |
| 206 | +- CSDN博客: https://renfufei.blog.csdn.net/ |
| 207 | +- 优秀作业参考: |
| 208 | + - <https://github.com/arthasking123/JAVA-000/tree/main/Week_08> |
| 209 | + - <https://github.com/mrzouwudi/JAVA-000/tree/main/Week_08> |
| 210 | + - <https://github.com/jesse0722/JAVA-000/tree/main/Week_08> |
| 211 | + |
| 212 | + |
| 213 | + |
| 214 | + |
| 215 | +## 9周 |
| 216 | + |
| 217 | + |
| 218 | +提示: |
| 219 | + |
| 220 | +- id 可以使用 BIGINT(20), 更加专业一些。 |
| 221 | +- 根据实际情况, 可以在某些情况下, 使用 BIGINT 来存储金额,单位则约定为"分", 由程序进行换算, 避免程序层面出现精度丢失。 |
| 222 | +- 如果使用BigDecimal计算, 则一定要指定精度和四舍五入规则; 并且与数据库字段的精度对应。 |
| 223 | +- 《Java资料链接汇总》: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 224 | +- 往期优秀作业链接: <https://github.com/lw1243925457/JAVA-000> |
| 225 | +- 李睿老师的完整RPC实现: <https://github.com/tcray/rayrpc/tree/master> |
| 226 | +- 秦老师推荐书单: <https://kimmking.github.io/> |
| 227 | +- 铁锚的技术文章翻译: <https://github.com/cncounter/translation/> |
| 228 | + |
| 229 | + |
| 230 | + |
| 231 | + |
| 232 | + |
| 233 | +## 10周 |
| 234 | + |
| 235 | + |
| 236 | +请思考以下问题: |
| 237 | + |
| 238 | +- 通过这个作业有哪些收获? |
| 239 | +- RPC通信中有哪些需要注意的问题? |
| 240 | +- 序列化和反序列化框架有哪些?需要注意什么? |
| 241 | +- 往期优秀作业链接: <https://github.com/lw1243925457/JAVA-000> |
| 242 | +- 秦老师推荐书单: <https://kimmking.github.io/> |
| 243 | +- Java资料链接汇总: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 244 | +- 李睿老师的完整实现: <https://github.com/tcray/rayrpc/tree/master> |
| 245 | +- 铁锚的技术文章翻译: <https://github.com/cncounter/translation/> |
| 246 | + |
| 247 | + |
| 248 | + |
| 249 | +## 11周 |
| 250 | + |
| 251 | + |
| 252 | +提示: |
| 253 | +1. 锁的实现需要考虑加锁时的失败自动重试机制以及自动过期 |
| 254 | +2. 正常释放锁时要判断lock值是否一致,最好是通过 lua 脚本来保证操作的原子性。 |
| 255 | +3. 推荐使用 redisson,封装的 api 简单易用。 |
| 256 | +4. 分布式减库存操作需要加锁,而且需要在库存上加锁,不能使用 userId 等 |
| 257 | +5. 推荐阅读 《Redis 操作手册; 基于Redis 5版本,微信读书可以免费阅读 |
| 258 | +6. 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000 |
| 259 | +7. 《Java资料链接汇总: https://shimo.im/docs/YGjGgTWwgD6V3wkp/ |
| 260 | +8. 秦老师推荐书单: https://kimmking.github.io/ |
| 261 | +9. Redis集群入门简介[系列文章]: https://github.com/cncounter/translation/tree/master/tiemao_2021/31_redis_cluster |
| 262 | +10. 免费好用的Redis图形界面客户端: Another: https://gitee.com/qishibo/AnotherRedisDesktopManager/releases |
| 263 | + |
| 264 | + |
| 265 | + |
| 266 | +## 12周 |
| 267 | + |
| 268 | +锻炼动手能力, 加油! |
| 269 | + |
| 270 | +提示: |
| 271 | +1. 尝试分析一下本地缓存与分布式缓存的适用场景。 |
| 272 | +2. 尝试分析缓存数据的特征: 变化频率, 数据量, 不一致的容忍时间, 网络带宽占用压力,延迟以及并发请求数... |
| 273 | +3. 总结消息队列的优缺点: 异步解耦、削峰填谷、增强并发性能和横向扩展能力... |
| 274 | + |
| 275 | +- 往期优秀作业链接: <https://github.com/lw1243925457/JAVA-000> |
| 276 | +- 《Java资料链接汇总: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 277 | +- Redis集群入门教程(中文翻译): <https://github.com/cncounter/translation/blob/master/tiemao_2021/31_redis_cluster/01-cluster-tutorial.md> |
| 278 | +- 免费好用的Redis图形界面客户端: Another: https://gitee.com/qishibo/AnotherRedisDesktopManager/releases |
| 279 | + |
| 280 | + |
| 281 | + |
| 282 | + |
| 283 | +## 13周 |
| 284 | + |
| 285 | + |
| 286 | +请思考以下问题: |
| 287 | + |
| 288 | +- 生产端如何保证消息的顺序性? |
| 289 | +- 消费端如何保证消息的顺序性? |
| 290 | +- 如何防止消息的重复消费? |
| 291 | +- 如何防止消费失败或者消息丢失? |
| 292 | +- 幂等性是怎么回事?如何保证?在哪个层级保证? |
| 293 | + |
| 294 | +- 往期优秀作业链接: <https://github.com/lw1243925457/JAVA-000> |
| 295 | +- 《Java资料链接汇总》: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 296 | +- 秦老师推荐书单: https://kimmking.github.io/ |
| 297 | +- 铁锚的翻译仓库: <https://github.com/cncounter/translation/> |
| 298 | + |
| 299 | + |
| 300 | + |
| 301 | +## 14周 |
| 302 | + |
| 303 | + |
| 304 | +- 往期优秀作业链接: <https://github.com/lw1243925457/JAVA-000> |
| 305 | +- 《Java资料链接汇总: <https://shimo.im/docs/YGjGgTWwgD6V3wkp/> |
| 306 | +- 秦老师推荐书单: https://kimmking.github.io/ |
| 307 | +- 铁锚的翻译仓库: <https://github.com/cncounter/translation/> |
| 308 | + |
| 309 | + |
| 310 | + |
| 311 | +## 毕业总结: |
| 312 | + |
| 313 | +恭喜你完成学业,祝未来的工作和学习旅程越来越顺利! |
| 314 | +认真总结,这份坚持和努力值得肯定。 |
| 315 | +提示: 很多东西用自己的语言来转述一遍,收获和理解会更深刻。 聚沙成塔的同时,也需要梳理知识体系,形成自己的核心脉络与钢筋铁骨。 |
0 commit comments