-
是的,wait()唤醒后必须重新获取对象锁才能返回,这是JVM规范强制要求的MESA管程语义;唤醒不保证条件仍成立,须用while循环检查而非if。
-
Selector不直接提供获取活跃SelectionKey数量的API,但可通过selector.selectedKeys().size()获取当前就绪key的数量,该值仅在select()等方法返回后有效,且需注意手动清理以避免重复计数。
-
该用CyclicBarrier而非CountDownLatch时:需多线程彼此等待、同时出发,且需重复使用;CyclicBarrier支持循环重用,适用于分段执行+同步汇合+迭代场景。
-
Runtime.getRuntime().exec()执行shutdown命令需显式调用cmd/c并传入参数数组,如{"cmd","/c","shutdown","-s","-t","60"},避免字符串拼接;取消用{"cmd","/c","shutdown","-a"};注意权限、stderr日志、ProcessBuilder替代及-t参数校验。
-
Java反射机制允许程序在运行时动态检查和修改类结构与行为,其核心应用包括框架实现(如SpringIoC、JUnit)、序列化库(如Jackson)、动态代理(如AOP、RPC)、ORM框架(如Hibernate)及通用工具开发。使用反射时需注意性能问题(如查找解析开销、安全检查、JVM优化受限)和安全性问题(如绕过访问控制、反射注入风险)。编写高效反射代码的策略包括:1.完善异常处理;2.缓存Class/Method/Field对象;3.最小化反射使用范围;4.优先使用公开API;5.考虑替代方案(如工
-
应优先用List.copyOf确保底层数据彻底不可变,它复制新列表并返回JDK10+内置不可变实现;Collections.unmodifiableList仅包装视图,原始列表变更会影响视图。
-
IDEA中PlantUML插件失效主因是Graphviz未配置PATH或Java版本与插件不兼容,需确保dot命令可用、使用0.36+插件适配JDK17+,并手动指定最新plantuml.jar路径,且仅对有效.java文件生效。
-
Semaphore用于限制并发访问资源的数量,如停车场示例中控制5个停车位的分配,通过acquire获取许可、release释放许可实现限流;CountDownLatch用于等待一组操作完成,如主线程等待3个子任务执行完毕后再继续,通过countDown递减计数、await阻塞等待归零。两者均属于java.util.concurrent包,适用于不同协作场景:前者适合资源池管理,后者适合任务同步,结合ExecutorService可更好管理线程生命周期,合理选用可简化并发逻辑。
-
SimpleDateFormat非线程安全,多线程应避免共享实例;需显式设置时区和Locale以保证一致性;通过setLenient(false)开启严格解析防止误转换;注意格式大小写区分,推荐新项目使用DateTimeFormatter。
-
本文介绍如何避免阻塞调用(如block())和深层flatMap嵌套,通过Mono.expand()高效、非阻塞地将依赖前序结果的Mono调用序列转化为连续的Flux流。
-
Java源文件必须满足:最多一个public类且文件名严格匹配;package声明须在最顶部;import紧随其后;可含多个非public顶层类。
-
设计Java类继承应明确“is-a”关系,优先使用抽象类或接口定义契约,避免过深继承层级,建议不超过三层,多用组合替代继承以提升灵活性;遵循里氏替换原则,确保子类可安全替换父类,不改变程序正确性;合理使用protected和final控制访问与扩展,父类不应被实例化时声明为abstract;核心是围绕领域模型设计,确认子类确实是父类的一种,再使用继承实现多态与接口统一。
-
Java方法名必须是动词或动词短语,以小写字母开头、驼峰式命名,准确表达行为意图;布尔方法须以is/has/can开头;应避免名词前置、缩写、同义词混用及过度泛化。
-
hash()函数对非null键执行(h=key.hashCode())^(h>>>16)扰动以改善低位散列,null则直接返回0;数组长度需为2的幂以使(n-1)&hash等价于取模并保留高位信息。
-
Java中实现对象克隆最直接的方式是实现Cloneable接口并重写clone()方法,默认为浅拷贝;必须实现Cloneable因它是JVM识别可克隆的标记接口,否则抛CloneNotSupportedException;正确重写需声明public、调用super.clone()、处理异常;浅拷贝下引用字段共享,需手动深拷贝;现代开发更推荐拷贝构造器等替代方案。