Skip to content

Mistakes

Bryant Hang edited this page Sep 12, 2019 · 45 revisions

以下错误以版次1为基础,部分错误在后续的两次重印中已经修复或者页码发生了变动。

  • P59:单元测试的代码中“public static void initMethod”和“public static void afterMethod”应该为“public void initMethod”和“public void afterMethod”

  • P54: “提示”的第一点改为“.gitignore中添加不需要版本管理的文件,如:.DS_Store、logs、target、node_modules等。根据工程的类型不同这里需要加入的文件也不同。”

  • P67: “这里根据笔者自己的一些经验和实践,列出一些最为需要遵循的Java编码规范。”下面的第二点应为“变量和类命名务必具有意义,能让人一眼看出表示的意思。如userList表示用户列表,不要使用list、set、button这种无意义的命名方式。”

  • P69: 此页最后一点修改为“程序需要状态,对象不需要状态,如果对象有了状态,就会引发多线程问题。程序的状态应该统一由数据库、缓存、任务队列这些外部容器来容纳,处理时以局部变量的形式在线程内部流转直至被回收。”

  • P86: “3.3日志”这一节,在构造Logger时,由于一些代码片段没有写出所在的类,因此使用了this.getClass()代替了类对象字面量,没有做特殊说明,造成了读者误解。在实际使用时,this.getClass()都应该换成所在类的类对象字面量,如"LoggerTest.class"。

  • P99: “4) 切换 JCL 到 SLF4J。”中的“jul-over-slf4j”应为“jcl-over-slf4j”

  • P114:第二点,“Controller防范”应该为“Controller方法”。

  • P139:Spring Data MongoDB的使用注意的第二点表述有误,应为“Spring Data MongoDB会把实体类中的id属性转换为_id(MongoDB默认使用的主键field),因此当你使用MongoTemplate做了数据操作后,再使用Mongo Java Driver查询的时候要使用_id而不是id。”。

  • P153: “在数据库做主从分离的情况下,经常选择MyISAM作为主库的引擎。”应该为“在数据库做主从分离的情况下,经常选择MyISAM作为从库的引擎。”

  • P157: 第九点“使用limit offset查询缓慢时,可以借助索引来提高性能。”下面的SQL语句应该为"SELECT * FROM test_user a JOIN (select id from test_user limit ?, ?) b ON a.id = b.id "。

  • P162: “向对方账户增加n元”下面的修改为"update user_account set amount = amount + n where id = xx; "

  • P186: 本地缓存的第一点应为"ConcurrentHashMap"。

  • P191: 数据失效和淘汰一节,volatile-lru是redis 3.0之前的版本的默认淘汰策略,之后的版本的默认淘汰策略为noeviction。

  • P191: 数据失效和淘汰一节,最后一个淘汰策略为noeviction。

  • P237: 第4点的最后一段应该为“综上,负载低的情况下可以每个线程消费多个Partition。但负载高的情况下,Consumer线程数最好和Partition数量保持一致。如果还是消费不过来,应该在增加Partition数的同时增加Consumer数或者提升消息处理能力。”

  • P244: 内存分配过程第一步应为"编译器通过逃逸分析,确定对象是在栈上分配还是在堆上分配。如果是在栈上分配,则将对象打散(每一个字段做为一个局部变量)分配在栈上。"。

  • P247: Safepoint的最后一项修改为“循环的末尾,可以防止大循环的时候一直不进入Safepoint,而其他线程在等待。这里需要注意,如果是被JIT编译后的二进制码,则只有在无界循环的末尾才会进入Safepoint,而循环计数使用long类型,即使有次数限制,也被认为是无界循环。有界循环如果没有方法调用或者方法调用被内联则需要一直到循环结束才会进入Safepoint。”。

  • P259: "epoll使用nmap..."应该为"epoll使用mmap..."

  • P262: “Selector在线程run方法中无线循环轮询准备就绪的Key。”改为“Selector在线程run方法中无限循环轮询准备就绪的Key。”

  • P272: 并发框架中的Executor最后一句表述有误,应为“这里需要注意的一点是,所有的ExecutorService在使用submit或者周期性调度方法(scheduleWithFixedDelay和scheduleAtFixedRate)时对任务的异常都做了捕获,当任务代码抛出异常时,无法拿到错误,并且当使用的是周期调度时任务抛出异常后即会停止。需要你在自己的任务中(Runnable或者Callable)捕获异常并处理。”。

  • P289: “第4点 属性名称转化”的最后一段改为“ PropertyNamingStrategy还支持KebabCase(短横线连接单词)、PascalCase(大写字母开头)以及CamelCase(驼峰)。”

  • P297: 此页最后一段表述模糊,是讲述的从旧版本JDK升级到JDK8时的一个问题。应为“使用Map还有一点需要注意的是,ConcurrentHashMap的keySet方法被修改了, 如果用到这个方法且声明的时候使用的ConcurrentHashMap,那么从旧版本JDK升级到JDK8时会报错,可以使用ConcurrentMap声明或者不要使用此方法。”。

  • P298: "LocalDateTime.now();//当前事件"应为"LocalDateTime.now(); //当前时间"

  • P310: 倒数第二段“CPU的情况可以通过查看/proc/cpu来获得”应为“CPU的情况可以通过查看/proc/cpuinfo来获得”

  • P315: 最后一段中的“ps -Le”应为“ps -p [pid] -Leo pid,lwp,pcpu --sort -pcpu”

  • P326: "打开GC日志..."这一点下面的配置应为“-XX:PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:$CATALINA_BASE/logs/gc.log”

  • P370: 第24点,“show innodb engine status”应该为“show engine innodb status”

Clone this wiki locally