54 归档分页
370 留言互动
4 核心专题

最近更新

Java 2021-11-04

如何避免创建不必要的对象?

在 Java 开发中,应尽量避免创建功能相同的对象以节省内存和提升性能。使用字符串常量池代替 `new String`,在循环中复用同一 `String`;根据需求选用 `String`(不可变)、`StringBuilder`(可变、单线程)或 `StringBuffer`(线程安全)。对布尔值使用 `Boolean.valueOf` 而非 `new Boolean`,因为前者直接返回已缓存的实例。尽量避免自动装箱/拆箱导致的对象创建,优先使用基本类型 `int` 而非包装类 `Integer`。正则表达式应先 `Pattern.compile` 再复用匹配器,避免在循环中重复编译。上述技巧均可显著降低对象创建次数,提升程序运行效率。

面试 阅读全文
Java 2021-11-05

如何正确的释放资源?

文章指出在 Java 中手动在 finally 块里关闭 I/O 流会导致代码冗长、易忘记关闭且异常处理不佳,示例代码即有此弊端。推荐使用 Java 7 引入的 try‑with‑resources,前提是资源实现 AutoCloseable,代码更简洁、自动释放且无需关心关闭顺序。文中也给出手动关闭的可变参数工具方法,但提醒其必须严格按顺序调用。综上,最优雅可靠的资源释放方式仍是 try‑with‑resources。

面试 阅读全文
Java 2021-11-10

如何实现线程复用?

线程池通过维护 Worker 对象实现复用。execute 先在核心线程数范围内尝试 addWorker 创建线程,若达上限则把任务放入 workQueue。Worker 持有 Thread 并实现 Runnable,其 run 方法调用 runWorker。runWorker 在循环中先执行 firstTask,再不断从队列获取任务并执行 task.run();run 本身不再创建新线程,线程始终在同一 Thread 上循环处理任务直至关闭。于是同一线程被重复利用,完成线程复用的核心机制。

源码 多线程 阅读全文
Java 2021-11-04

脏写、脏读、不可重复读和幻读

文章说明并发事务会产生脏写、脏读、不可重复读和幻读四类并发问题,并通过示例阐明其产生原因:未提交事务被其他事务读写导致数据回滚或结果不一致。随后介绍事务隔离机制和四种隔离级别(READ‑UNCOMMITTED、READ‑COMMITTED、REPEATABLE‑READ、SERIALIZABLE),说明各级别对上述现象的防护能力,并指出 MySQL 默认使用 REPEATABLE‑READ。

MySQL 阅读全文
源码 2021-11-03

AQS源码分析

AQS(AbstractQueuedSynchronizer)通过 volatile 的 state 与 CLH 双向链表实现同步,维护 head、tail 指向的等待队列。它支持独占和共享两种模式,核心方法 acquire/release 与 acquireShared/releaseShared 采用模板方法,子类只需实现 tryAcquire/tryRelease 或对应的共享 try 方法。Node 类保存线程、前后指针、waitStatus(CANCELLED、SIGNAL、CONDITION、PROPAGATE)等信息。文中以自定义 Mutex 为例展示独占同步器的实现,包括 tryAcquire、tryRelease、ConditionObject 的使用,并分析 acquire、addWaiter、enq 等源码流程,说明线程如何加入等待队列并竞争资源。

多线程 阅读全文
Java 2021-11-03

isAssignableFrom()方法与instanceof关键字

isAssignableFrom()和instanceof都用于类型判断,但侧重点不同。isAssignableFrom()在类层面比较,调用者是父类Class,参数是子类或自身Class,用于判断一个类是否可以赋值给另一个类;instanceof在实例层面比较,左侧是对象实例,右侧是其类或父类类型,用于判断对象是否是某类或其子类的实例。文章通过接口、父类、子类的代码示例展示两者的调用方式和输出结果,说明isAssignableFrom()判断“是否为父类”,instanceof判断“是否为子类”。

反射 阅读全文