-
wait和notify必须在synchronized块中调用,否则抛IllegalMonitorStateException;需用同一锁对象、while循环检测条件、volatile或锁保护条件变量,优先用notifyAll(),禁用sleep轮询。
-
Queue接口是约定行为的契约,不保证FIFO但标准实现默认遵循;add()失败抛异常,offer()返回false更安全;poll()/peek()空时返回null,remove()/element()则抛异常;ArrayDeque适合单线程高性能,LinkedBlockingQueue和queue.Queue才用于多线程。
-
DateTimeFormatter的核心作用是格式化时间对象为字符串及解析字符串为时间对象,是Java8后线程安全的唯一推荐方案,替代了不安全的SimpleDateFormat。
-
推荐用UUID.randomUUID().toString().replace("-","")生成idempotentId——简单无依赖、碰撞概率可忽略;校验必须放在Service层入口,Controller只透传;唯一索引兜底优先选ONDUPLICATEKEYUPDATE;清理pending记录需加分布式锁并结合状态与时间判断。
-
Java对象与JSON转换常用Jackson和Gson库实现,1.Jackson需添加jackson-databind依赖,使用ObjectMapper的writeValueAsString和readValue方法进行序列化和反序列化;2.Gson需引入gson依赖,通过Gson实例的toJson和fromJson完成转换;3.注意类需有无参构造函数,字段建议私有并提供getter/setter,日期格式可自定义,集合转换时Gson需TypeToken获取泛型类型,Jackson支持注解忽略字段,Spri
-
自定义注解驱动深层属性映射通过@CopyField声明字段拷贝规则,结合反射实现动态、可控的深拷贝,支持嵌套路径、类型转换、循环引用防护等,适用于运行时灵活控制场景。
-
ArrayDeque做栈比Stack快,因Stack继承Vector有同步开销,而ArrayDeque是非线程安全、数组实现、无锁的;用push/pop/peek,初始化容量建议设为2的幂。
-
根本原因是ArrayList迭代器采用fail-fast机制,遍历时检测到modCount被修改即抛ConcurrentModificationException;CopyOnWriteArrayList通过写时复制、读用快照绕过校验,但仅适用于读多写少场景。
-
动态菜单管理需将菜单数据存入数据库并结合权限控制,采用单表自关联设计sys_menu表,后端按用户权限查询组装树形结构并缓存,前端动态注册路由并递归渲染,配合路由守卫与按钮级权限校验。
-
Phaser是为动态、多阶段、可变参与线程数的协作场景设计的同步工具;适用于准备→预处理→主计算→汇总等分阶段且每阶段线程数可变的流程。
-
JDK动态代理通过接口+反射+InvocationHandler统一实现权限校验与事务管理,要求目标类必须实现接口;invoke方法中按序执行权限检查、事务开启、业务调用、提交/回滚;支持注解驱动的条件增强。
-
Condition.await()不能替代Object.wait()随意调用,因必须先持有对应ReentrantLock锁,否则抛IllegalMonitorStateException;await()自动释放锁,唤醒后需重新竞争锁,且须置于while循环中防虚假唤醒。
-
ExceptionUtils.getStackTrace()是ApacheCommonsLang提供的将Throwable转为完整堆栈字符串的方法,用于日志记录、告警或监控上报等需全量堆栈的场景,不输出到控制台。
-
LongAdder通过Cell数组与@Contended注解实现缓存行隔离,天然缓解FalseSharing;其add()分层降级策略将写操作分散至独立缓存行,sum()弱一致性适合写多读少场景。
-
MongoDB官方Java驱动和SpringDataMongoDB均未提供内置的文档版本控制功能,需通过手动添加版本字段、历史集合或变更流等方式实现,本文详解三种主流实现方案及代码示例。