Java业务开发常见错误100例
朱晔
贝壳金服资深架构师
立即订阅
8933 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 业务代码真的会有这么多坑?
免费
代码篇 (23讲)
01 | 使用了并发工具类库,线程安全就高枕无忧了吗?
02 | 代码加锁:不要让“锁”事成为烦心事
03 | 线程池:业务代码最常用也最容易犯错的组件
04 | 连接池:别让连接池帮了倒忙
05 | HTTP调用:你考虑到超时、重试、并发了吗?
06 | 20%的业务代码的Spring声明式事务,可能都没处理正确
答疑篇:代码篇思考题集锦(一)
07 | 数据库索引:索引并不是万能药
08 | 判等问题:程序里如何确定你就是你?
09 | 数值计算:注意精度、舍入和溢出问题
10 | 集合类:坑满地的List列表操作
11 | 空值处理:分不清楚的null和恼人的空指针
12 | 异常处理:别让自己在出问题的时候变为瞎子
答疑篇:代码篇思考题集锦(二)
13 | 日志:日志记录真没你想象的那么简单
14 | 文件IO:实现高效正确的文件读写并非易事
15 | 序列化:一来一回你还是原来的你吗?
16 | 用好Java 8的日期时间类,少踩一些“老三样”的坑
17 | 别以为“自动挡”就不可能出现OOM
18 | 当反射、注解和泛型遇到OOP时,会有哪些坑?
19 | Spring框架:IoC和AOP是扩展的核心
20 | Spring框架:框架帮我们做了很多工作也带来了复杂度
答疑篇:代码篇思考题集锦(三)
设计篇 (7讲)
21 | 代码重复:搞定代码重复的三个绝招
22 | 接口设计:系统间对话的语言,一定要统一
23 | 缓存设计:缓存可以锦上添花也可以落井下石
24 | 业务代码写完,就意味着生产就绪了?
25 | 异步处理好用,但非常容易用错
26 | 数据存储:NoSQL与RDBMS如何取长补短、相辅相成?
答疑篇:设计篇思考题答案合集
安全篇 (5讲)
27 | 数据源头:任何客户端的东西都不可信任
28 | 安全兜底:涉及钱时,必须考虑防刷、限量和防重
29 | 数据和代码:数据就是数据,代码就是代码
30 | 如何正确保存和传输敏感数据?
答疑篇:安全篇思考题答案合集
加餐 (8讲)
31 | 加餐1:带你吃透课程中Java 8的那些重要知识点(一)
32 | 加餐2:带你吃透课程中Java 8的那些重要知识点(二)
33 | 加餐3:定位应用问题,排错套路很重要
34 | 加餐4:分析定位Java问题,一定要用好这些工具(一)
35 | 加餐5:分析定位Java问题,一定要用好这些工具(二)
36 | 加餐6:这15年来,我是如何在工作中学习技术和英语的?
答疑篇:加餐篇思考题答案合集
37 | 加餐7:程序员成长28计
结束语 (3讲)
结束语 | 写代码时,如何才能尽量避免踩坑?
结课测试 | 关于Java业务开发的100个常见错误,你都明白其中缘由了吗?
结课问卷获奖用户名单
Java业务开发常见错误100例
15
15
1.0x
00:00/00:00
登录|注册

答疑篇:代码篇思考题集锦(一)

朱晔 2020-03-23
你好,我是朱晔。
在回复《Java 业务开发常见错误 100 例》这门课留言的过程中,我看到有些同学特别想看一看咱们这个课程所有思考题的答案。因此呢,我特地将这个课程涉及的思考题进行了梳理,把其中的 67 个问题的答案或者说解题思路,详细地写了出来,并整理成了一个“答疑篇”模块。
我把这些问题拆分为了 6 篇分别更新,你可以根据自己的时间来学习,以保证学习效果。你可以通过这些回答,再来回顾下这些知识点,以求温故而知新;同时,你也可以对照着我的回答,对比下自己的解题思路,看看有没有什么不一样的地方,并留言给我。
今天是答疑篇的第一讲,我们一起来分析下咱们这门课前 6 讲的课后思考题。这些题目涉及了并发工具、代码加锁、线程池、连接池、HTTP 调用和 Spring 声明式事务的 12 道思考题。
接下来,我们就一一具体分析吧。

01 | 使用了并发工具类库,线程安全就高枕无忧了吗?

问题 1:ThreadLocalRandom 是 Java 7 引入的一个生成随机数的类。你觉得可以把它的实例设置到静态变量中,在多线程情况下重用吗?
答:不能。
ThreadLocalRandom 文档里有这么一条:
Usages of this class should typically be of the form: ThreadLocalRandom.current().nextX(…) (where X is Int, Long, etc). When all usages are of this form, it is never possible to accidently share a ThreadLocalRandom across multiple threads.
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java业务开发常见错误100例》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥29.9
立即订阅
登录 后留言

精选留言(5)

  • Darren
    老师的答疑文章真的是超级棒;看到事务传播特性,突然觉得好陌生,好久没有关注了,再次熟悉了下😂,简单的总结下:

    首先举个可能不是很适合的例子解释下保存点:比如银行转账发送短信业务(在同一事务中);可以简单的理解为转账和发送短信两个业务,如果没有保存点的话,发送短信失败了,转账业务也需要回滚,想想是不是很恐怖,但是如果有了保存点的概念,就可以只需要回滚到上一个保存点即可,无需回滚整个事务;所以在上面的场景中,虽然转账和发送短信在同一事务中,但是转账结束后,可以增加保存点,即使发送短信失败,也不会影响转账业务。

    Spring 中就是采用保存点(Savepoint)实现嵌套(NESTED)事务原理,Spring官方文档描述如下:
    PROPAGATION_NESTED uses a single physical transaction with multiple savepoints that it can roll back to. Such partial rollbacks let an inner transaction scope trigger a rollback for its scope, with the outer transaction being able to continue the physical transaction despite some operations having been rolled back. This setting is typically mapped onto JDBC savepoints, so it works only with JDBC resource transactions. See Spring’s DataSourceTransactionManager.

    NESTED和REQUIRED修饰的内部方法都属于外围方法事务,如果外围方法抛出异常,这两种方法的事务都会被回滚。但是REQUIRED是加入外围方法事务,所以和外围事务同属于一个事务,一旦REQUIRED事务抛出异常被回滚,外围方法事务也将被回滚。而NESTED是外围方法的子事务,有单独的保存点,所以NESTED方法抛出异常被回滚,不会影响到外围方法的事务。

    NESTED和REQUIRES_NEW都可以做到内部方法事务回滚而不影响外围方法事务。但是因为NESTED是嵌套事务,所以外围方法回滚之后,作为外围方法事务的子事务也会被回滚。而REQUIRES_NEW是通过开启新的事务实现的,内部事务和外围事务是两个事务,外围事务回滚不会影响内部事务。

    作者回复: 赞

    2020-07-14
    1
    6
  • kyl
    朱老师的课程不要太棒👍
    2020-07-19
    1
  • 捞鱼的搬砖奇
    “value 的获取比较昂贵” 这里的昂贵要怎么理解呢
    2020-08-01
    1
  • 捞鱼的搬砖奇
    老实方便说下课程代码怎么运行么,要去调整 POM 里的 main class 配置嘛

    作者回复: pom里的mainclass打包用,直接运行main方法即可,springboot程序

    2020-07-14
    1
  • Bug? Feature!
    Mark!
    2020-07-14
收起评论
5
返回
顶部