Skip to content

Commit 95dcfbb

Browse files
authored
Create 作业注意事项.md
作业注意事项
1 parent ad0fa06 commit 95dcfbb

File tree

1 file changed

+315
-0
lines changed

1 file changed

+315
-0
lines changed

作业注意事项.md

Lines changed: 315 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,315 @@
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

Comments
 (0)