java
-
并行和并发有什么区别?
并行是多任务真正同时执行,需多核支持;并发是任务快速切换,单核即可实现。并行提升性能,并发提高资源利用率与响应速度。常见模型有多线程、事件驱动、Actor模型和协程。避免并发问题可使用锁、原子操作、不可变对象、并发容器、线程池等。未来趋势包括异构计算、函数式编程、反应式编程、无锁编程和自动并发。 并…
-
多线程锁的升级原理是什么?
锁升级是JVM根据竞争情况动态调整锁状态以优化性能的过程;2. 偏向锁在无竞争时记录线程ID,避免同步开销,一旦有其他线程竞争即失效并升级为轻量级锁;3. 轻量级锁通过CAS操作和自旋尝试获取锁,减少阻塞开销,自旋一定次数后仍无法获取则升级为重量级锁;4. 重量级锁基于操作系统互斥量实现,线程竞争失…
-
kafka 可以脱离 zookeeper 单独使用吗?为什么?
Kafka目前仍依赖ZooKeeper进行元数据管理、控制器选举和集群协调,因其在设计初期将ZooKeeper作为核心协调服务;尽管KIP-500引入KRaft模式,通过Raft共识协议将元数据管理内置于Kafka,逐步实现去ZooKeeper化,但该功能仍在演进中,生产环境建议暂用ZooKeepe…
-
说一下 jvm 有哪些垃圾回收算法?
标记-清除算法通过标记存活对象后清除未标记对象,但会产生内存碎片;2. 复制算法将内存分为两块,存活对象复制到另一块以避免碎片,适用于新生代但内存利用率低;3. 标记-整理算法在标记后将存活对象 compact 到一端,减少碎片且提升利用率,适合老年代;4. 分代收集基于对象生命周期划分区域,新生代…
-
java 中Iterator 怎么使用?有什么特点?
Iterator通过iterator()获取,使用hasNext()和next()遍历元素,可安全删除;其具备fail-fast机制、单向遍历、统一接口等特点,适用于List、Set等集合。 Iterator 是 Java 集合框架中用于遍历集合元素的一个接口,主要用在 List、Set、Queue…
-
理解乐观锁和悲观锁
悲观锁认为并发冲突常见,因此在操作前加锁以保证独占,如数据库行锁或synchronized;乐观锁假设冲突较少,允许并行操作,在提交时通过版本号或时间戳检查冲突,适用于读多写少场景。两者核心哲学不同:悲观锁追求安全性,牺牲性能;乐观锁追求高并发,容忍重试。选择取决于业务对一致性与性能的权衡。 理解乐…
-
说一下 jvm 的主要组成部分?及其作用?
JVM核心组件包括类加载器、运行时数据区、执行引擎、JNI和垃圾回收器。1. 类加载器加载.class文件,支持双亲委派模型,确保类的唯一性和安全性;2. 运行时数据区分为方法区、堆、虚拟机栈、本地方法栈和程序计数器,分别管理类信息、对象实例、线程执行上下文等;3. 执行引擎通过解释器和JIT编译器…
-
redis 怎么实现分布式锁?
Redis实现分布式锁需利用SET命令的NX和PX选项保证原子性,通过唯一值标识锁持有者并用Lua脚本安全释放锁,防止死锁需设置合理过期时间或使用Watchdog续租,避免误删需校验持有者身份,高并发场景可选Redlock或Redis Cluster提升可靠性与性能。 Redis实现分布式锁,简单来…
-
怎么实现动态代理?
动态代理是一种在运行时生成代理对象的技术,用于在不修改目标对象的前提下增强其功能。它通过JDK动态代理(基于接口)或CGLIB(基于继承)实现,前者要求目标类实现接口,后者可代理普通类但无法处理final类或方法。核心价值在于解耦横切关注点,如日志、事务、权限控制等,广泛应用于Spring AOP、…
-
java 中线程有哪些状态?
Java线程有六种状态:1. NEW,线程创建但未启动;2. RUNNABLE,线程就绪或运行中;3. BLOCKED,等待获取监视器锁;4. WAITING,无限期等待其他线程唤醒;5. TIMED_WAITING,限时等待自动恢复;6. TERMINATED,线程执行完毕或异常终止。 Java …