Java 业务开发常见错误 100 例
朱晔
贝壳金服资深架构师
51940 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
代码篇 (23讲)
Java 业务开发常见错误 100 例
15
15
1.0x
00:00/00:00
登录|注册

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

你好,我是朱晔。
在回复《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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 业务开发常见错误 100 例》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(23)

  • 最新
  • 精选
  • 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是通过开启新的事务实现的,内部事务和外围事务是两个事务,外围事务回滚不会影响内部事务。

    作者回复: 赞

    3
    35
  • LGY001
    朱老师的课程真的好,很早就买了课但是一直没有沉下心去看,最近通勤的时候听了几篇,听到朱老师文章时候感觉很惊艳,下班了赶紧仔细阅读发现能从中收获到需要知识,非常感谢朱老师的分享!!!

    作者回复: 如果觉得好多分享给身边朋友

    3
  • 雨后晴天
    老师,自定义激进的线程池,在达到最大线程数后通过拒绝策略写队列,executor.getQueue().offer()执行后不是直接返回false吗?还能写得进去吗

    作者回复: 不是同一个重载方法

    2
  • 捞鱼的搬砖奇
    老实方便说下课程代码怎么运行么,要去调整 POM 里的 main class 配置嘛

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

    2
    1
  • luke Y
    "虽然另一个线程把 b 设置为了 false,但是这个字段在 CPU 缓存中,另一个线程(主线程)还是读不到最新的值。使用 volatile 关键字,可以让数据刷新到主内存中去。准确来说,让数据刷新到主内存中去是两件事....." 老师我有个问题,如果是单核cpu那么是不是就没有 文中的可见性问题了

    作者回复: 并不能这么理解

    2
  • terryking
    老师,问一下,对于socket的发送缓冲区是针对每一个socket都是独立的一份缓冲区还是全局tcp协议就一个呢?如果是独立的一份那网卡驱动又是怎么找这些缓冲区的呢?优先级又是怎样的?如果是全局一份,那对于没有收到ack的消息是会一直阻塞向网络中发送数据,直到某一个客户端的ack返回么?谢谢老师,麻烦有时间回复一下

    作者回复: 独立缓冲区,网络、os、应用层数据流转过程,详细看下Understanding Linux Network Internals一书

  • LGY001
    朱老师,我想问一下第六篇的第二个问题答疑中的Aspectj与lombok插件冲突解决的相关问题,“这样 AspectJ 编译不会有问题,同时需要设置中的 sourceDirectory 为 delombok 目录 : <sourceDirectory>${project.build.directory}/generated-sources/delombok</sourceDirectory>”,您文章中的这句话什么意思,相关配置项应该在哪里配置呢?希望老师可以解答一下

    作者回复: pom 里面配置

  • 向博士后进军
    没看懂computeIfAbsent,putIfAbsent的区别呢

    作者回复: 我写了一段代码来证明这三点,你可以点击这里的 GitHub 链接查看。。。

  • kyl
    朱老师的课程不要太棒👍
    6
  • 饭粒
    主课,代码,答疑做的都太到位了。
    1
收起评论
显示
设置
留言
23
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部