Java工程师必知:并发工具、线程池与数据库事务的陷阱

需积分: 5 0 下载量 83 浏览量 更新于2024-06-19 收藏 1.78MB PDF 举报
"Java高手笔记-工程师必须知道的事" 在Java编程中,理解并掌握关键知识点是成为高手的关键。以下是一些重要的话题,涵盖了并发工具、加锁代码、线程池、连接池、HTTP调用、数据库事务、数据库索引、判等问题以及数值计算和集合类的使用。 1. 并发工具: - ThreadLocal:在Web环境中,不正确使用ThreadLocal可能导致数据错乱,因为它为每个线程提供单独的变量副本。 - ConcurrentHashMap:虽然它是线程安全的,但如果使用不当,如未正确处理并发操作,仍可能出现线程安全问题。同时,应充分利用其并发性优势,避免无谓的同步。 - CopyOnWriteArrayList:在高并发但修改较少的场景下使用,可以避免大量复制,但在修改频繁的情况下可能导致性能下降。 2. 加锁代码: - 确保清楚地知道需要保护的数据和代码段,否则可能导致锁无效,线程安全问题依然存在。 - 考虑锁的粒度,粗粒度锁可能导致不必要的阻塞,而细粒度锁可提高并发性能。 - 注意锁的场景,例如死锁问题,可以通过工具如VisualVM进行检测和避免。 3. 线程池: - 使用Executors创建线程池可能导致内存溢出(OOM),尤其是固定线程池和缓存线程池的不当使用。 - 自定义线程池时要考虑线程管理策略,比如如何更好地处理拒绝策略,如CallerRunsPolicy可能会导致主线程执行任务,影响性能。 - 不复用线程池会导致频繁创建销毁线程,增加系统开销,而混用线程池可能导致任务调度混乱。 4. 连接池: - 客户端SDK API通常有同步、异步和基于回调的三种形式,了解这些可以帮助优化并发性能。 - Jedis在多线程环境中的线程安全问题需要通过正确管理和同步来避免。 5. HTTP调用: - 连接超时和读取超时的设置要合理,避免误解导致异常处理或性能问题。 - Spring Cloud Feign和Ribbon的超时配置需谨慎,防止异常处理不当。 - Apache HttpClient对并发连接数有限制,需要配置以适应高并发需求。 6. 数据库事务: - Spring声明式事务的配置错误可能导致事务失效,注意事务边界和异常处理。 - 事务回滚规则,即使事务生效,某些情况下也可能无法回滚,比如数据库的隔离级别设置。 - 无异常并不意味着事务一定会提交,需理解事务提交的条件。 7. 数据库索引: - 聚簇索引影响数据物理存储,理解其对查询速度的影响。 - 二级索引(非聚簇索引)维护、空间占用和回表代价都是设计索引时需要考虑的因素。 - 建立的索引未被查询优化器使用的情况,可能是因为SQL语句优化或索引选择不当。 8. 判等问题: - 对象判等不应仅依赖`==`,而是应该使用`equals`方法,注意`equals`和`hashCode`的一致性。 - 实现`equals`时要遵循约定,防止出现意外行为,Lombok的`@EqualsAndHashCode`使用时要留意潜在问题。 9. 数值计算: - 浮点数运算使用`double`可能导致精度问题,应使用`BigDecimal`进行精确计算。 - `BigDecimal`的比较和格式化操作需谨慎,尤其是与`equals`的使用。 - 防止数值溢出,尤其是在整数类型转换时,可以使用`BigInteger`或检查溢出条件。 10. 集合类: - 使用集合类时,特别是`HashSet`,要避免直接使用不可变对象或不支持`equals`和`hashCode`的对象,可能导致预期外的行为。 - 对于数值计算和集合操作,要特别关注可能的异常和性能影响。 这些知识点涵盖了Java开发中的许多常见问题和最佳实践,理解和掌握它们能够帮助提升代码质量,减少错误,并优化应用性能。