课程内容:
课程1、Java中的多线程与并发编程,某一线公司技术专家任富飞。 Part1:11-22,周一,18:45-19:45,主要内容:
Java多线程原理、各种锁的机制和应用(重量级锁、轻量级锁,可重入锁,偏向锁,公平锁,自旋锁,读写锁,乐观锁等)、四种线程池的原理、类型、配置参数和经验,Spring中线程池的应用,几种常用原子类的原理和使用场景。
Part2:11-26,周五,18:45-19:45,主要内容:AQS原理,三种常用并发工具类(CountdownLatch/Semaphore/CyclicBarrier)使用场景示例,线程安全编程和优化经验。
课程2、JVM的体系发展与优化经验,长亮科技北京平台团队负责人秦金卫。 Part1:11-29,周一,18:45-19:45,主要内容:JVM基础(字节码、内存模型、类加载器),各种不同的GC(串行GC、并行GC、CMS、G1、ZGC)的基本原理、常用参数和分析经验。 Part2:12-03,周五,18:45-19:45,主要内容:常见JVM命令行工具、可视化工具,以及高级工具的使用,通过GC日志、线程堆栈、飞行记录以及可视化分析等方式,实现JVM运行状态的分析和优化,常见的JVM问题排查。
课程3:事务原理与Spring事务机制,京东科技技术专家、Apache Shenyu项目负责人、《分布式事务原理与实战》作者肖宇。 Part1:12-06,周一,18:45-19:45,主要内容:关系数据库的事务机制和隔离级别(读未提交/读已提交/可重复读/串行化),Spring TX事务管理器的功能特性、使用方式。 Part2:12-10,周五,18:45-19:45,主要内容:Spring TX事务管理器的原理设计,相关的API和注解,传播特性,跟其他框架的集成,以及常见问题处理经验。
课程4、网络编程NIO与Netty实践,长亮科技北京平台团队负责人秦金卫。 Part1:12-13,周一,18:45-19:45,主要内容:Java网络编程模型,BIO/NIO/AIO,Reactor/Proactor网络模型,select/epoll机制; Part2:12-17,周五,18:45-19:45,主要内容:Netty的基本原理、常见用法与网络编程优化经验,Channel/EventLoop/Handler/Adapter
批阅原则:
-
- 认可与表扬认真学习的同学, 尽量给与正面反馈, 加油打气。
-
- 对一些问题和不足进行友善的提示, 都是成年人, 大家都要面子。
-
- 引导同学们学习各种进阶知识,拓展知识点。
简介:
铁锚:系统架构师,Java性能调优专家。
CSDN博客专家: https://renfufei.blog.csdn.net/
热爱程序开发和设计; 积极应对各种情境和挑战;
喜欢钻研新技术, 闲暇时喜欢翻译和分析英文文档/技术博客。
技术文章翻译仓库: https://github.com/cncounter/translation/
提示:
- 尝试自己从头绘制一幅图形,完善后向自己的同事或者朋友介绍,加深自己的印象和理解
- JDK7及之前的版本是永久代, 对应到JDK8及以后是Meta区, class信息保存着方法区之中。
- 常量池位于方法区/Meta区之中, Mata区归属于非堆内存(Non-Heap),不是堆外内存,也不是直接内存
- CCS是开启指针压缩时才有的, 关闭指针压缩则此空间的大小为0
- 直接内存(Direct)属于堆外内存,不属于非堆
- 堆外内存可简单划分为(Direct, Native), 本次作业对应的所有内存区域都在JVM进程内部
- JIT编译后的机器代码缓存到 code cache/非堆之中;
-Xmx
和-Xms
设置的是整个堆内存的大小,不是老年代。- 和年轻代(young/nursery)不一样,新生代实际上是 Eden 区, 由
-Xmn
与存活区的比例来控制 - 栈内存不在堆内存之中,也不属于堆外内存,是一个独立的部分。
- 注意区分线程栈以及内部的栈帧结构;
-Xss
控制单个线程的栈空间最大大小 - 编码风格: 建议增加中间变量,增加可读性,可读性和可维护性是构建大型复杂系统的基石。
- 注意关闭输入输出流,最好是谁控制着打开的,就由谁在同一个方法内将其关闭。
- 在开发中可以打断点调试,查看class加载时的调用栈和调用关系。
- 作业参考链接: https://github.com/JavaCourse00/JavaCourseCodes/tree/main/01jvm
- 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
- 秦老师推荐书单: https://kimmking.github.io/
- 铁锚的翻译仓库: https://github.com/cncounter/translation/
认真完成作业和整理笔记
-
在finally中关闭输入输出流是一个好习惯; 每次提交认真写提交日志也是一个好习惯。
-
分辨HTTP1.0与HTTP1.1的区别;
-
可以尝试分析G1中混合模式 mixed GC的威力; 选择哪种垃圾收集器,主要考虑的是业务特征(实时/非实时),跟内存大小关系并不太大。
-
与外部系统的交互,在允许的情况下,最好是输出详细的交互日志, 包括: [uri,请求参数/body,响应信息,耗时信息]等等。
-
性能测试时需要排除各种干扰,只改变单个变量然后进行对比,例如: 客户端线程数,并发连接数/用户数,去除随机数的随机性(指定random种子)等等。
-
编码风格: 建议增加中间变量,增加可读性,可读性和可维护性是构建大型复杂系统的基石。
-
建议: 适当使用一些通用工具类,例如 apache的commons-io等等,里面的 IOUtils之类的工具很好用。
-
建议:趁机使用和学习 markdown 文件,做好目录和链接引用,在互联网上很方便,而且可以导出为各种格式。常用工具: Typora 等。
-
往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
-
作业参考链接: https://github.com/JavaCourse00/JavaCourseCodes/tree/main/02nio
-
《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
-
秦老师推荐书单: https://kimmking.github.io/
-
铁锚的翻译仓库: https://github.com/cncounter/translation/ 【可以找感兴趣的技术文章看看】
提示:
-
梳理一下网关需要执行的操作和处理逻辑,对比一下Nginx是怎么处理的。
-
使用自己的包名, 来标识自己的作品
-
通过 .gitignore 文件来忽略某些文件。
-
性能测试时需要排除各种干扰,只改变单个因素, 然后进行对比,例如: 客户端线程数,并发连接数/用户数等等。
-
不要用实例变量来存储某些信息,避免多线程环境下的出错,以及多次请求互相污染。
-
适当增加必要的注释来增加可读性,说明某段代码的作用和实现逻辑,但不要太多或者太少 ^_^
-
响应头之中也可以加上某些 X-开始的header,方便调试和追踪,更像一个网关
-
响应消息写入完成后, 记得 flush 和 close。推荐在finally中关闭,避免中间过程抛异常导致资源不关闭,引发内存泄漏, 在高并发场景中造成问题。
-
可以了解一下 ByteArrayOutputStream,挺好用.
-
注意Java输入流的特征,以及基于buffer的读取和写入方法, 不要写多了, 也不要读漏了.
-
注意区分 HTTP1.0 和 HTTP1.1的差异
-
所有使用 getBytes 和String相关的方法都需要指定具体的编码, 避免默认语言问题。
-
往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
-
《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
-
秦老师推荐书单: https://kimmking.github.io/
-
铁锚的技术文章翻译: https://github.com/cncounter/translation/
笔记整理。
提示:
- 请复习创建线程池的方法, 分辨 cached 方式的线程池是先加队列还是先创将cache线程? 提示: core,queue,cache,reject
- 多线程代码中,共享状态的变量需要特殊处理,比如使用 volatile 来强制从内存读取最新值,或者直接使用原子类来保存。
- 思考各种线程协同方式的本质是什么?
- 想想怎么让线程处于各种不同的状态, 以及怎么获取这些状态信息
- 线程最重要的属性是哪些?
- 尝试使用反射方式在main方法中将这些方法全部调用起来
- 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
- 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
- 秦老师推荐书单: https://kimmking.github.io/
- 铁锚的技术文章翻译: https://github.com/cncounter/translation/
并发相关的面试题,在【第一课】【预习资料以及环境准备】里面的压缩包之中。
提示:
- 枚举实际上是可以通过反射往里面加东西的,当然,在编译期间不可见,属于运行时hack修改。
- 反编译工具可以使用: jd-gui, 或者 jclasslib
- 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
- 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
- 秦老师推荐书单: https://kimmking.github.io/
- 深入系列: InnoDB存储引擎: https://github.com/cncounter/translation/tree/master/tiemao_2020/44_innodb-storage-engine
提示:
- 建议: 在Table级别使用 utf8mb4 字符集
- 设计合理的SQL语句和注释,并通过Git形成版本化。
- 使用BIGINT来存储Long类型的时间戳timeMillis,减少对时区的依赖。
- 可以根据业务需要, 增加联合索引。
- 可以结合自己在网上购物的经历, 思考如何设计订单表。
- 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
- 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
- InnoDB的锁和事务模型
通过上周的课程学习, 经过本次作业实践, 请思考以下问题:
- MySQL数据库中, int(2) 和 int(10) 有什么区别?
- 订单表中的【创建时间】字段采用以下类型, 各自的优缺点是什么?
- A、 datetime
- B、 timestamp
- C、 bigint
- D、 int
- E、 varchar
提示: 0. 想一想限制数据库TPS的瓶颈点有哪些? 分析整个请求执行链路上的各个环节, 并尝试解决各种环节下的瓶颈。
- 可以使用aop来做动态切换,根据sql类型来做数据源切换不能很好支持强制走主库查询的情况
- 注解时考虑使用数据源名称,而不是master-slave;应用内可能有多个数据库组(比如账号数据一套主从,订单数据一套主从)
- 考虑多个从库的情况
- 注解加到mapper(dao层),而不是service层;具体实现可以考虑各种情景确定是否采用注解赋予的建议。
- aop可以看下AbstractPointcutAdvisor
- 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
- 可以参考的作业实现:
- https://github.com/CHImPB/JAVA-000/tree/main/Week_07
- https://github.com/ykthree/JAVA-000/tree/main/Week_07
- 秦老师推荐书单: https://kimmking.github.io/
- 铁锚的技术文章翻译: https://github.com/cncounter/translation/
提示:
- 想想什么情况下适合使用分表,什么情况下适合使用分库,各有什么优缺点?
- 注意分库与分表的表达式, 避免分布不均匀或者导致空表
- 适当增减注释来说明每一块代码的意图。
- 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
- 秦老师推荐书单: https://kimmking.github.io/
- 铁锚的技术文章翻译: https://github.com/cncounter/translation/
- CSDN博客: https://renfufei.blog.csdn.net/
- 优秀作业参考:
提示:
- id 可以使用 BIGINT(20), 更加专业一些。
- 根据实际情况, 可以在某些情况下, 使用 BIGINT 来存储金额,单位则约定为"分", 由程序进行换算, 避免程序层面出现精度丢失。
- 如果使用BigDecimal计算, 则一定要指定精度和四舍五入规则; 并且与数据库字段的精度对应。
- 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
- 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
- 李睿老师的完整RPC实现: https://github.com/tcray/rayrpc/tree/master
- 秦老师推荐书单: https://kimmking.github.io/
- 铁锚的技术文章翻译: https://github.com/cncounter/translation/
请思考以下问题:
- 通过这个作业有哪些收获?
- RPC通信中有哪些需要注意的问题?
- 序列化和反序列化框架有哪些?需要注意什么?
- 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
- 秦老师推荐书单: https://kimmking.github.io/
- Java资料链接汇总: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
- 李睿老师的完整实现: https://github.com/tcray/rayrpc/tree/master
- 铁锚的技术文章翻译: https://github.com/cncounter/translation/
提示:
- 锁的实现需要考虑加锁时的失败自动重试机制以及自动过期
- 正常释放锁时要判断lock值是否一致,最好是通过 lua 脚本来保证操作的原子性。
- 推荐使用 redisson,封装的 api 简单易用。
- 分布式减库存操作需要加锁,而且需要在库存上加锁,不能使用 userId 等
- 推荐阅读 《Redis 操作手册; 基于Redis 5版本,微信读书可以免费阅读
- 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
- 《Java资料链接汇总: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
- 秦老师推荐书单: https://kimmking.github.io/
- Redis集群入门简介[系列文章]: https://github.com/cncounter/translation/tree/master/tiemao_2021/31_redis_cluster
- 免费好用的Redis图形界面客户端: Another: https://gitee.com/qishibo/AnotherRedisDesktopManager/releases
锻炼动手能力, 加油!
提示:
- 尝试分析一下本地缓存与分布式缓存的适用场景。
- 尝试分析缓存数据的特征: 变化频率, 数据量, 不一致的容忍时间, 网络带宽占用压力,延迟以及并发请求数...
- 总结消息队列的优缺点: 异步解耦、削峰填谷、增强并发性能和横向扩展能力...
- 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
- 《Java资料链接汇总: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
- Redis集群入门教程(中文翻译): https://github.com/cncounter/translation/blob/master/tiemao_2021/31_redis_cluster/01-cluster-tutorial.md
- 免费好用的Redis图形界面客户端: Another: https://gitee.com/qishibo/AnotherRedisDesktopManager/releases
请思考以下问题:
-
生产端如何保证消息的顺序性?
-
消费端如何保证消息的顺序性?
-
如何防止消息的重复消费?
-
如何防止消费失败或者消息丢失?
-
幂等性是怎么回事?如何保证?在哪个层级保证?
-
往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
-
《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
-
秦老师推荐书单: https://kimmking.github.io/
- 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
- 《Java资料链接汇总: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
- 秦老师推荐书单: https://kimmking.github.io/
- 铁锚的翻译仓库: https://github.com/cncounter/translation/
恭喜你完成学业,祝未来的工作和学习旅程越来越顺利! 认真总结,这份坚持和努力值得肯定。 提示: 很多东西用自己的语言来转述一遍,收获和理解会更深刻。 聚沙成塔的同时,也需要梳理知识体系,形成自己的核心脉络与钢筋铁骨。