-
CyclicBarrier不能替代CountDownLatch因其语义不同:前者是“全部到达后一起继续”且可重用,后者是“倒计数为零后释放等待线程”且不可重用;误用会导致串行、卡死或BrokenBarrierException。
-
单例模式在Java中有6种常见实现方式,各有适用场景。1.饿汉式:类加载时即创建实例,线程安全但不支持延迟加载,适合性能要求高、创建成本低的对象;2.懒汉式:首次调用时创建,需加锁保证线程安全,适合并发不高场景;3.双重检查锁定:仅首次创建时加锁,结合volatile关键字防止重排序,兼顾性能与安全,广泛采用;4.静态内部类:利用类加载机制实现线程安全延迟加载,推荐使用;5.枚举方式:语法简洁,天然防反射和反序列化破坏单例,适合不介意枚举写法的情况;6.容器或Spring框架管理:通过@Component
-
contains查的是元素的逻辑相等,即调用equals()方法而非==;自定义类必须重写equals()和hashCode(),否则可能始终返回false;ArrayList.contains是O(n)顺序查找,HashSet.contains平均O(1)哈希查找。
-
MixedGC触发需先满足堆占用超InitiatingHeapOccupancyPercent(默认45%)以启动并发标记,完成后才可能执行;其回收老年代Region数量由G1MixedGCCountTarget、G1OldCSetRegionThresholdPercent及MaxGCPauseMillis动态调控,非固定或全量清理。
-
transient关键字用于指定字段不被序列化,如敏感信息、临时数据或线程资源,防止其写入持久化介质;反序列化时这些字段恢复为默认值。例如User类中password和loginCount声明为transient后不会被自动序列化,但可通过重写writeObject和readObject方法实现加密存储与恢复,从而在安全性和灵活性间取得平衡。
-
Reference.reachabilityFence并非修复NPE的万能药,而是防止JVM过早判定对象不可达的编译器屏障;它仅在对象本应可达但因激进优化(如逃逸分析)被误回收时生效,且必须紧邻最后一次使用、在同一栈帧内调用,配合Cleaner或PhantomReference使用才有效。
-
put()先判null键存table[0],否则扰动hash、位运算算下标,空桶直插,否则遍历链表/树用equals()比key;get()性能取决于哈希分布,最理想O(1),冲突时链表O(n/2)、红黑树O(logn);链表≥8且数组≥64才树化,退化阈值为6;null键唯一且固定table[0],扩容触发rehash,遍历首选entrySet()。
-
Instrumentation.redefineClasses仅支持修改已加载类的方法体,禁止增删字段/方法、修改签名、继承关系或类结构,否则抛UnsupportedOperationException。
-
Objects.requireNonNullElse()是Java9引入的非空断言+默认值兜底方法,要求obj为null时返回非null的defaultObj,否则抛NPE;适用于轻量、确定、非null的默认值场景。
-
锁降级需显式调用tryConvertToReadLock且必须用原写锁stamp,失败时须先unlockWrite再readLock并重读字段;其价值在于写锁修正状态后转读锁支持并发只读计算,避免全程持写锁阻塞读请求。
-
异常信息必须包含上下文,不能只抛newRuntimeException("出错");应拼入关键变量、状态或输入值,并用带cause的构造函数保留原始堆栈;日志级别需匹配异常性质,WARN用于业务校验失败,ERROR用于系统级故障。
-
标记接口是无方法的类型标签,用于运行时识别并触发自定义序列化或克隆策略;它语义明确、零开销,优于注解和trait,但需配合手动类型检查使用。
-
短路运算符仅在左操作数确定整体结果时跳过右表达式:&&左为false、||左为true时生效;需确保左操作数稳定快速且分布利于提前终止,避免异常、副作用或耗时操作置于左侧。
-
确保安装JDK并配置JAVA_HOME;2.下载Gradle二进制包并解压;3.设置GRADLE_HOME和PATH环境变量;4.运行gradle-v验证安装成功。
-
Map的replaceAll方法可高效批量更新值,通过BiFunction函数式接口对每个键值对的值进行替换,支持数值计算、字符串处理等场景,如涨薪10%或添加用户名前缀,该方法直接修改原Map,需注意避免null返回及并发修改问题。