-
Java中线程间通信最基础方式是wait()、notify()、notifyAll()配合synchronized使用,三者属Object类方法,必须在同步上下文中调用,否则抛IllegalMonitorStateException;wait()释放锁并等待,notify()唤醒一个等待线程,notifyAll()唤醒全部;需用while循环检查条件防虚假唤醒,且须确保监视器对象一致。
-
Java包装异常需封装原始Throwable为cause并补充业务消息,避免暴露敏感信息;日志和API响应中须剥离敏感字段,禁用递归序列化堆栈;ExceptionUtils可简化链式处理但不自动脱敏;异步场景需手动传入cause以保留准确堆栈。
-
jrunscript因依赖的Nashorn引擎在JDK11被弃用、JDK15彻底移除而无人使用,仅限JDK8–11且不支持ES6+、性能差、无调试;替代方案包括GraalVMContextAPI、Node.js外调或Java原生方法。
-
当在SpringDataJPA中用@Query执行原生SQL或JPQL查询并返回多列结果时,若直接使用List<Tuple>且未正确配置查询类型(如误用原生SQL但未指定nativeQuery=true),易触发IndexOutOfBoundsException;推荐改用构造器表达式返回自定义DTO或Tuple实例。
-
要在SpringBoot应用中监控MongoDB,核心步骤包括:1.添加Micrometer相关依赖;2.配置Prometheus注册表;3.启用Actuator端点。通过引入spring-boot-starter-actuator和micrometer-registry-prometheus等依赖,SpringBoot自动配置MongoMetricsAutoConfiguration,为MongoDB注入CommandListener以收集命令执行和连接池指标。随后,在application.yml中开
-
LockSupport.parkNanos不挂起线程是因为前置unpark消耗了许可或线程已被中断;参数单位为纳秒,误用毫秒值会导致等待时间远短于预期;它不释放锁、不抛InterruptedException,仅响应中断状态且不自动清除。
-
Arrays.stream()用于数组,Collection.stream()用于集合类。前者是Arrays工具类的静态方法,支持基本类型数组并返回特化流;后者是Collection接口的默认方法,仅适用于对象集合,通过集合对象直接调用,内部基于迭代器实现。
-
构造方法重载允许类中定义多个参数不同的构造方法,提升对象创建灵活性。通过参数数量、类型或顺序区分,支持this()调用且必须位于首行。例如Person类可定义单参、双参、三参构造方法实现逐步初始化。但参数多或类型相近时易降低可读性,如newPerson("Alice",25,"alice@example.com")难以直观理解各参数含义。为此可采用静态工厂方法命名构造意图,如Person.named("Alice")、Person.withNameAndAge("Alice",25),增强语义表达;对参数
-
不是必须但强烈建议显式声明;因Exception实现Serializable,未声明时JVM自动生成serialVersionUID,类结构变更会导致反序列化失败,如RMI、Dubbo等跨JVM场景。
-
对象状态迁移本质是将流程逻辑从if-else中解耦,通过state字段+显式校验驱动行为变化;需用enum定义状态、封装变更方法、校验合法性,小规模用switch更轻量,复杂流程才用State模式或SpringStateMachine,并发下必须数据库条件更新+应用层校验。
-
继承问题源于误将其当作代码复用首选而非is-a关系建模工具,如Stack继承Vector破坏封装;应优先组合、慎用protected、避免构造器中调用可重写方法。
-
本文深入解析JPA的@Access注解如何在单个字段上覆盖默认访问策略,通过AccessType.FIELD与AccessType.PROPERTY混用实现细粒度控制,并提供可验证的单元测试证明其行为差异。
-
用StringBuilder.reverse()最省事但会修改原对象;应优先使用newStringBuilder(str).reverse().toString()避免副作用,手写翻转只需遍历一半长度。
-
选用ArrayList而非普通数组,因其支持动态扩容及add()、remove()等便捷方法;商品类需定义id、name、price、quantity并实现Serializable;购物车用ArrayList<Product>泛型声明,增删改查需按ID操作、合并数量、避免强转与并发问题。
-
Java代码块是用{}括起的独立逻辑段,静态代码块(static{})随类加载执行一次,实例代码块({})每次创建对象时执行且优先于构造方法;执行顺序为父类静态→子类静态→父类实例→父类构造→子类实例→子类构造。