笔记抄写理解:Java业务开发常见错误100例子

1.并发工具

1.在Web环境中使用ThreadLocal出理数据错乱的坑

2.使用了ConcurrentHashMap,但还是出现了线程安全问题

3.使用了ConcurrenthHashMap,但却没有发挥性能优势

4.在不合适的场景下使用CopyOnWriteArrayList导致的性能问题

2.代码加锁

1.没有理清楚线程安全问题的所在点,导致锁无效

2.加锁没有考虑锁的粒度,可能导致性能问题

3.加锁没有考虑锁的场景,可能导致性能问题

4.多把锁要格外小心死锁问题(VisualVM)

3.线程池

1.使用Executors声明线程池,导致两种类型的OOM

2.线程池线程管理策略详解,如何实现一个更激进的线程池?

3.没有复用线程池,导致频繁创建线程的事故

4.混用线程池导致的性能问题

5.CallerRunsPolicy拒绝策略可能带来的问题

4.连接池

1.你知道常见的Client SDK的API有哪三种形式吗?

2.在多线程环境下,使用Jedis出现的线程安全问题

3.不复用Apache CloseableHttpClient会导致的问题(jstack、lsof、Wireshark)

4.小心数据库连接池打满后,出现性能问题(JConsole)

5.HTTP调用

1.连接超时和读取超时的五个认知误区

2.Spring Cloud Feign和Ribbon 配合使用,设置超时的三个坑

3.Spring Cloud Ribbon 居然会自动重试我的接口?

4.小心Apache HttpClient对于并发连接数的限制

6.数据库索引问题

1.什么是聚簇索引?

2.考虑二级索引维护、空间和回表的代价

3.用不上索引的三种情况

4.创建多个独立索引,还是联合索引?

5.MySQL如何确定是否走索引?(MySQL optimizer trace)

7.判断问题

1.不能使用==进行值判断等的情况(-XX:+PrintStringTableStatistic)

2.实现equals方法可能出现的诸多坑

3.equals和hashCode没有配对实现的坑

4.equals和compareTo实现逻辑不一致的坑

5.Lombok @EqualsAndHashCode 可能的坑

8.数值计算

1.使用double进行浮点数运算的坑

2.double或float舍入、格式化的坑

3.使用equals对BigDecimal进行判断等的坑

4.把BigDecimal作为Key加入HashSet的坑

5.小心数值溢出但是没有任何异常的坑

9.集合类

1.使用Arrays.asList把数据转换为List的三个坑

2.使用List.subList进行切片操作居然会导致OOM

3.使用数据结构需要考虑时间和空间的平衡 MAT

4.LinkedList的适用场景

10.空值处理

1.注意5种可能出现空指针的情况(Arthas)
2.POJO字段设置默认值导致数据库中的原始被覆盖的坑
3.数据库中的null字符串问题
4.客户端不传值和传null在POJO中都是null,如何区分?
5.数据库中涉及null的三个容易忽略的坑

11.异常处理

1.仅在框架层面粗犷捕获和处理异常合适吗?
2.各种错误的异常处理方式
3.在finally中抛出异常会怎么样?
4.异常可以定义为静态变量吗?
5.线程池通过execute提交任务,出现异常会怎样?
6.线程池通过submit提交任务,出现异常会怎样?

12.日志

1.你能区分SLF4J的桥接类库和绑定类库吗?
2.配置不当导致日志重复记录的问题
3.异步日志可能撑爆内存的问题
4.异步日志可能出现日志丢失的问题
5.异步日志还是会阻塞方法的问题
6.使用{}占位符语法记录日志的意义在于什么?

13.文件IO

1.为什么读写文件会遇到乱码问题?

2.使用Files.lines等返回Stream方法进行IO操作的大坑(lsof)

3.设置缓冲区对读写文件的性能影响有多大?

14.序列化

1.使用RedisTemplate保存数据,Redis中出现乱码的问题

2.使用RedisTemplate出现ClassCastException的问题

3.注意Jackson反序列化对额外字段的处理

4.自定义ObjectMapper可能会覆盖Spring Bean

5.枚举作为API接口参数或返回值的两个大坑

6.注意反序列化可能不会调用自定义的构造方法的坑

15.日期时间

1.初始化日期时间的各种坑

2.SimpleDateFormat的三个坑

3.时区问题导致日期时间计算的坑

4.使用时间戳进行日期时间计算的坑

5.Java8的日期时间类型

16.OOM

1.太多粉相同的对象导致OOM的坑(MAT)

2.使用WeakHashMap居然也会出现OOM?

3.Tomcat参数不合理导致的OOM的血案(MAT)

17.高级特性

1.通过反射调用方法调用了错误方法重载的坑

2.泛型经过类型擦除覆写失败的坑

3.泛型经过类型擦除会多出桥接方法的坑(javap、jclasslib)

4.注解即使加上了@Inherited,也无法从接口和方法继承的问题

18.Spring 框架

1.注意Beam默认单例的问题

2.单例的Beam注入多例的Beam不仅仅是设置Scope这么简单

3.自定义Aspect因为顺序问题导致Spring事务失效的坑

4.Feign AOP切不到的诡异案例

5.配置文件中的配置不生效的问题

19.代码重复

1.利用工厂模式+模板方法模式,消除if...else和大量重复代码

2.利用注解+反射消除重复代码

3.利用属性拷贝工具消除重复代码

20.接口设计

1.接口的响应要明确表示接口的处理结果

2.要考虑接口变迁的版本控制策略

3.要明确接口同步异步处理方式

21.缓存设计

1.把Redis当成数据库会有什么问题?

2.小心缓存雪崩问题

3.小心缓存击穿问题

4.小心缓存穿透问题

5.先更新缓存还是先更新数据库?

22.生产就绪

1.如何写一个正确的健康检测接口?

2.如何对外暴露应用内部重要组件的状态?

3.为什么指标Metrics对于问题定位这么重要?

23.异步处理

1.为什么异步处理中消息补偿这么重要?

2.为什么异步处理需要实现操作幂等?

3.消息模式配置错误导致消息重复或遗漏的坑

4.消息队列被死信堵塞的坑

24.数据存储

1.与MySQL相比,Redis更擅长和不擅长什么?

2.与MySQL相比,Elasticsearch更擅长和不擅长什么?

3.与MySQL相比,InfluxDB更擅长和不擅长什么?

4.配合使用No SQL 和RDBMS,对应高并发的存储方案

25.数据源头

1.客户端的计算不可信

2.客户端提交的参数需要校验

3.不能信任请求头里的任何内容

4.用户标识不能从客户端获取

26.安全兜底

1.如何防止平台资源被刷?

2.如何防止虚拟资产无限发放?

3.如何防止重复的资金?

27.数据和代码

1.SQL注入如何拖库?(sqlmap)

2.小心代码注入问题

3.全方位堵漏XXS的四招

28.敏感数据

1.使用MD5摘要保存密码是否安全?

2.MD5摘要加盐的错误方式

3.注意使用安全的对称加密算法

4.使用AES-256-GCM和单独的加密服务,来加密敏感数据的案例

5.一张图说清HTTPS的基本原理

你可能感兴趣的:(java,p2p,开发语言)