《on Java 中文版》读后感(《JAVA编程思想》的原作者)(JAVA 小虚竹)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

主题


《On Java 8》 重讲了JAVA编程思想,本书基于Java8 的特性进行该语言的编程教学。

​ 但是现在java17都要发布了,如果只有增补了java8内容,会有所遗憾。所以图灵4位译者Bruce Eckel 讨论后决定,专门为中国读者新增一部分java11java17 的内容。这是对我们中国读者的福利了,哈哈。

image-20210928191530756

特色


​ 本书适合各个层次的Java开发者阅读,同时也可作为高等院校讲授面向对象程序设计语言以及Java语言的参考教材。

对我的影响


​ 读书时,在老师的推荐下接触到了《Java编程思想》(第4版) ,这本在我看来是“java圣经 ”。因为从我刚开始学习JAVA编程,到现在从业JAVA开发十年左右的时间里,在不同的阶段,每次阅读都会有所收获。

​ 我的一个糗事,刚好跟大家分享分享,我差点因为这本书,放弃编程这条路。我拿到这本**《Java编程思想》(第4版)** 纸质书时,特意比了下厚度,有4个手指头的厚度,总共快900页的书,这得看到什么时候。当时满怀激情,还列下了学习计划,每天学习一两个小时这本书。有句话说得好:坚持一个月养成好习惯 。结果是,从头到尾 一章章地阅读这本书,第一周凭激情坚持了下来,第二周就坚持不下去了,内容太干货了,硬啃太难受了。而且,第二周,第三周时,之前看的内容,也忘得七七八八了。编程太难了,我想回农村。

​ 但是老师强力推荐这本书,肯定是有价值的。是不是我的打开方式不对。难道要像易筋经那样,倒着看侧着看?后来去请教了老师,把我读不下去的问题跟老师请教。原来真的是打开方式不对,像这类的技术书,不应该像初中高中的教科书一样从头读到尾 ,我们学习用到的教科书,大部分的结构是由浅入深,前后的知识依赖性强,不能用挑着看 这种方式。但是**《Java编程思想》(第4版)** 这本书就可以。

书中每一章都会介绍一个或者一组互相关联的概念,同时这些概念不依赖于当前章节没有介绍的特性。因此,你可以结合当前获取的知识来充分理解上下文,然后再阅读下一章。

引自 《On Java 中文版(基础卷)》前言

​ 这本书的正确打开方式应该是,带着问题来找解决方案 。例如作业,课设和实战项目等这些就是比较好的切入点,举个例子,你要实现对文件的操作功能,包含创建文件,复制文件,文件追加文件和删除文件等功能,那就要了解第18章 JAVA I/0系统 。本章会介绍JAVA标准库中IO的各类以及它们的用法。在看的时候对某个概念不理解,就返回目录查看相关的章节内容。这样一来一回,不会枯燥,而且当把问题解决时,是会有成就感的。这种成就感,就会转化为坚持的激励。

​ 而且里面提供了很多代码例子,跟着一个个字母码代码,结合带着问题来找解决方案 。过程是bug满地的,通过一次次的调试和修改代码,结果是问题解决了,代码量上来了,兴趣也养成了。

内容分享

========================================================================

分享一个实战案例:《ThreadLocal在线程池中引发的问题》

ThreadLocal引发的血案


背景

张三在开发业务系统A,发现系统的当前用户的租户信息取不到,这种情况是偶发的,遇到过几次,无法直接重现。这个问题上报到了架构组,后面流转到了我的手上。

定位问题

首先,排查了获取当前用户的租户信息接口,经过压测,没有出现问题。

然后,在张三的开发环境上尝试重现,尝试多次,还真的出现了取不到当前用户的租户信息的问题。断点跟进时,发现获取的当前用户租户信息 变了,不应该啊,相同的session会话,用户没有做登出动作,也没有新的用户登录,当前用户租户信息 不应该会变化。

跟进代码查看,当前用户标识 是存在**ThreadLocal对象 ** 里的。

所以有可能是ThreadLocal 用法没用对。

ThreadLocal介绍

**ThreadLocal ** 通过字面上就很好理解,它是线程本地化变量。

并发编程时,经常遇到多线程操作同一个变量而导致处理异常。这个就是我们常说的线程不安全问题。针对这种情况需求:都使用同一个变量,但是要求每个线程里的这个变量值不会串掉,这时候就轮到**ThreadLocal ** 出马了。

**ThreadLocal对象 ** 通常当做静态域存储。可以为使用相同变量的每个不同线程创建不同的存储。

在创建ThreadLocal 时,只能通过get()set() 方法来访问对象的内容。

get方法 :将返回与线程相关联的对象副本;

set方法 :将参数插入到其线程存储的对象中,并返回存储中原有的对象。

ThreadLocal源码分析

package java.lang;

ThreadLocal 是JDK提供的源生代码。

get方法 源码

public T get() {

//g1

Thread t = Thread.currentThread();

//g2

ThreadLocalMap map = getMap(t);

//g3

if (map != null) {

ThreadLocalMap.Entry e = map.getEntry(this);

if (e != null) {

@SuppressWarnings(“unchecked”)

T result = (T)e.value;

return result;

}

}

//g4

return setInitialValue();

}

private T setInitialValue() {

//s1

T value = initialValue();

//s2

Thread t = Thread.currentThread();

//s3

ThreadLocalMap map = getMap(t);

//s4

if (map != null)

map.set(this, value);

else

createMap(t, value);

return value;

}

protected T initialValue() {

return null;

}

ThreadLocalMap getMap(Thread t) {

return t.threadLocals;

}

get方法 的代码逻辑

第一步:得到当前线程对象

第二步:获取当前线程对象的threadLocals 变量值,就是ThreadLocalMap

大家发现没,ThreadLocal 的值存储是存在线程的threadLocals 里的。而不是存在ThreadLocal 对象中。

第三步:如果map不等于null,从map中查找到本地变量的值,返回本地变量的值。

第四步:如果map为null,则返回初始化当前线程的本地变量。

初始化当前线程的本地变量方法 的代码逻辑

第一步:给变量value 设置null值,置空。

第二步:得到当前线程对象

第三步:获取当前线程对象的threadLocals 变量值,就是ThreadLocalMap

第四步:如果map不等于null,设置map的值,key为当前线程,值为设置成null的变量value

第四步:如果map为null,就要创建map,再设置值,代码如下,这个就很好理解了

void createMap(Thread t, T firstValue) {

t.threadLocals = new ThreadLocalMap(this, firstValue);

}

set方法 源码

public void set(T value) {

//s1

Thread t = Thread.currentThread();

//s2

ThreadLocalMap map = getMap(t);

//s3

if (map != null)

map.set(this, value);

else

createMap(t, value);

}

set方法 的代码逻辑

第一步:得到当前线程对象

第二步:获取当前线程对象的threadLocals 变量值,就是ThreadLocalMap

第四步:如果map不等于null,设置map的值,key为当前线程,值为入参的变量value

第四步:如果map为null,就要创建map,再设置值。

remove方法 源码

public void remove() {

//r1

ThreadLocalMap m = getMap(Thread.currentThread());

//r2

if (m != null)

m.remove(this);

知其然不知其所以然,大厂常问面试技术如何复习?

1、热门面试题及答案大全

面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer

2、多线程、高并发、缓存入门到实战项目pdf书籍

3、文中提到面试题答案整理

4、Java核心知识面试宝典

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入


《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
AVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入**

[外链图片转存中…(img-RmN85f1g-1714774228566)]

[外链图片转存中…(img-kTtfWPgO-1714774228566)]

[外链图片转存中…(img-GtHocF6q-1714774228567)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值