- 博客(127)
- 资源 (7)
- 收藏
- 关注
原创 ASM Opcodes 完整属性详解
Opcodes 类是 ASM 库中的常量定义类,包含了所有 Java 字节码操作码、访问标志、版本号等常量。这些常量用于在字节码级别操作和生成 Java 类。
2025-11-09 22:16:50
1002
原创 Java中的RecursiveTask
RecursiveTask是Java Fork/Join框架中用于处理可分解且需返回结果的并行任务的核心类。它通过分治策略将大任务递归拆分为子任务,利用工作窃取算法优化多核CPU利用率,适用于计算密集型操作如数值统计、排序等。使用时需设置合理阈值,确保任务独立性和轻量级结果合并,避免I/O操作和任务依赖。相比串行执行,它在亿级数据计算中可提升5-10倍性能,但不适合I/O密集或存在依赖的场景,此类情况建议改用CompletableFuture等方案。
2025-06-29 11:30:00
1691
原创 Java中的RecursiveAction
RecursiveAction是Java并发包中继承自ForkJoinTask的类,专为无返回值的可分治任务设计。其核心原理包括分治策略和工作窃取算法,通过ForkJoinPool管理线程池实现高效并行处理。使用时需继承RecursiveAction并重写compute()方法,合理设置任务拆分阈值。该工具适用于数据并行处理、分治算法等计算密集型场景,但不适合I/O密集或需结果聚合的任务。优化建议包括动态调整阈值、避免阻塞操作及优先使用invokeAll()。
2025-06-29 09:00:00
818
原创 Java中的Phaser
摘要: Phaser是Java并发库中的高级同步工具,支持多阶段任务协调与动态线程管理。其核心特性包括:1)分阶段同步机制,线程需同步后才能进入下一阶段;2)运行时动态调整参与者数量;3)可自定义阶段回调(如数据汇总)。相比CyclicBarrier和CountDownLatch,Phaser更适用于复杂场景(如多阶段并行计算、动态任务流水线),但学习成本较高。典型应用包括分治算法、游戏回合同步和批量数据处理。开发者需权衡其灵活性带来的性能开销,避免在简单场景中使用。
2025-06-28 09:00:00
881
原创 Java中的StampedLock
StampedLock是Java8引入的高性能读写锁,特别优化读多写少场景。它提供三种锁模式:独占写锁、共享悲观读锁和无锁乐观读,通过票据机制实现数据一致性验证。相比传统读写锁,StampedLock在读写性能上有显著提升,支持锁升级/降级,但不支持重入和条件变量。最佳适用场景包括缓存系统、配置管理等读密集型应用,而写频繁或需要条件变量的场景则不推荐使用。使用时需注意票据管理、乐观读验证和锁升级风险,以充分发挥其性能优势。
2025-06-27 08:30:00
961
原创 Java中的Exchanger
Java的Exchanger是一个用于双线程间双向数据交换的同步工具,通过配对点实现数据互换。其核心采用CAS和Arena模式处理线程竞争,支持泛型数据交换和超时控制。典型应用场景包括生产者-消费者缓冲交换、遗传算法等双线程协作。优点是轻量高效,但仅限两线程使用,需注意线程安全和超时处理。在多线程场景应改用其他同步工具。最佳实践是在严格双线程协作且数据交换频繁的场景中使用,结合缓冲区复用提升性能。
2025-06-26 08:30:00
752
原创 Java中的ReentrantReadWriteLock
摘要: ReentrantReadWriteLock是Java提供的读写分离锁,适合读多写少场景。读锁允许多线程并发读取(读读共享),写锁独占且互斥(读写/写写互斥)。核心特性包括重入性、公平性选择和锁降级(避免写后脏读)。使用时需注意:非公平锁默认更高吞吐,写操作应短促,严禁读锁升级(易死锁)。替代方案中,StampedLock适合读写均衡,ConcurrentHashMap适用于高并发集合。最佳实践包括锁降级保证数据安全,监控锁竞争优化性能。本文详解其AQS实现原理及典型应用场景(如缓存系统)。 (15
2025-06-25 08:30:00
591
原创 聊聊线程池的拒绝策略
Java线程池拒绝策略全面解析:内置策略包括AbortPolicy(抛出异常)、CallerRunsPolicy(调用者执行)、DiscardPolicy(静默丢弃)和DiscardOldestPolicy(丢弃旧任务),各有适用场景。自定义策略可通过异步重试队列、任务持久化或结合流控框架实现弹性处理。最佳实践需根据业务容忍度选择策略,关键系统建议持久化+告警,高并发场景推荐异步重试+限流。核心原则是宁可优雅降级也不让系统崩溃,实际案例证明合理策略可将订单丢失率显著降低。
2025-06-24 10:00:00
1801
原创 Java中的Semaphore
Java中的Semaphore是控制并发资源访问的关键工具,采用许可证机制实现流量限制。它基于AQS共享锁模式实现,支持公平与非公平两种获取方式,并提供acquire/release等核心操作。典型应用场景包括连接池管理、API限流和硬件资源共享。使用时需注意许可证泄漏问题,建议在finally块中释放许可。Semaphore特别适合读多写少的高并发场景,能有效提升系统稳定性,但需合理设置许可证数量并避免嵌套死锁。
2025-06-24 08:30:00
2445
原创 Java中的CopyOnWriteArrayList
CopyOnWriteArrayList是Java并发包中基于写时复制机制的线程安全列表,适用于读多写少的高并发场景。其核心原理是写操作时复制新数组进行修改,读操作无锁直接访问。主要特点包括读高性能、线程安全和迭代安全,典型用于事件监听器、配置管理等低频写入场景。优点是无锁读取高效,缺点是写操作开销大且内存占用高。使用时应控制数据量,避免频繁写入和大列表操作。该结构适合允许弱一致性的高读取场景,但写频繁时应选择其他并发容器。
2025-06-23 21:49:19
1122
原创 进程与线程
进程与线程是操作系统实现并发的核心概念。进程是资源分配的基本单位,拥有独立内存空间和系统资源,隔离性强但开销大;线程是CPU调度的基本单位,共享进程资源,开销小但隔离性弱。关键区别在于:进程间需要IPC通信,线程可直接共享内存(需同步)。进程切换涉及地址空间保存(微秒级),线程仅需保存栈和寄存器(纳秒级)。实际应用中,高隔离需求(如安全沙箱)选择进程,高并发任务(如Web服务器)选择线程。开发时需注意线程同步和进程IPC优化问题。
2025-06-23 21:44:52
995
原创 偏向锁撤销为什么会触发STW?
摘要:偏向锁撤销触发STW的根本原因是需保证内存一致性和线程状态确定性。当多线程竞争时,JVM必须暂停持有线程判断同步块状态并修改对象头标记,该操作只能在全局安全点执行以避免数据冲突。虽然单次撤销仅微秒级耗时,但高并发场景会导致显著性能下降。优化方案包括禁用偏向锁(-XX:-UseBiasedLocking)、监控安全点日志或升级JDK(15+默认关闭,18+已移除该机制)。建议高并发系统直接使用轻量级锁或并发工具类规避STW影响。(149字)
2025-06-22 21:25:17
797
原创 Java中的STW(Stop-The-World)
STW(Stop-The-World)是JVM执行关键操作时暂停所有应用线程的机制,主要触发于GC、JIT优化等场景。传统GC带来的STW可达数百毫秒,严重影响系统响应。现代解决方案包括:1)采用ZGC/Shenandoah等低延迟GC实现亚毫秒级暂停;2)调优JVM参数(禁用偏向锁、固定堆大小);3)代码层减少对象分配。监控方面可通过安全点日志分析STW原因,典型优化案例包括处理偏向锁撤销和长循环问题。未来Project Lilliput有望将STW降至微秒级。高并发系
2025-06-22 21:22:35
950
原创 Java中的ReentrantLock和synchronized
本文对比Java两种锁机制的核心差异、用法及适用场景。synchronized是JVM内置关键字,自动管理锁,适合简单同步和低竞争场景。ReentrantLock为JDK实现,提供高级功能如可中断、超时、公平锁及多条件变量,适合高并发复杂场景。
2025-06-22 21:15:21
865
原创 Java中的Collections.synchronizedMap
摘要:Collections.synchronizedMap()是Java中创建线程安全Map的简易方案,通过包装器模式实现全局锁机制,确保基础操作原子性。适用于低并发场景和遗留系统改造,但高并发时存在性能瓶颈。相比Hashtable更灵活,但需手动同步复合操作和迭代。核心优势是快速实现线程安全,但高并发场景推荐使用ConcurrentHashMap。典型应用包括配置缓存等读多写少的场景。(149字)
2025-06-22 15:43:45
1111
原创 Java中的ConcurrentHashMap
ConcurrentHashMap 是 Java 并发包(java.util.concurrent)中线程安全的哈希表实现,专为高并发场景设计,在保证线程安全的同时显著提升性能。
2025-06-22 15:40:32
900
原创 Java中的CyclicBarrier
Java中的CyclicBarrier:多线程协同屏障工具 CyclicBarrier是Java并发包中的同步工具,用于协调一组线程在屏障点同步。其核心特性包括: 循环使用:屏障可重复触发,自动重置计数器。 屏障动作:支持在所有线程到达后执行自定义任务。 线程阻塞:调用await()的线程会等待其他线程到达。 与CountDownLatch相比,CyclicBarrier可重用且支持屏障动作,适用于多阶段并行计算(如数据分片处理)、并发测试及分布式任务协调。底层基于ReentrantLock和Conditi
2025-06-21 17:13:59
710
原创 Java中的CountDownLatch
《Java CountDownLatch深度解析与企业应用》 摘要:CountDownLatch是Java并发包中的核心同步工具,采用计数器机制协调多线程执行顺序。其核心特性包括:初始化指定计数、原子性递减的countDown()、阻塞等待的await(),基于AQS实现无锁设计。企业级应用场景主要覆盖:1)微服务启动协调,等待依赖服务就绪;2)电商数据聚合,并行调用多服务后渲染页面;3)分布式任务分治,批量处理后的结果汇总。使用时需注意其一次性特性(不可重置),建议配合超时控制与异常处理。相比Cyclic
2025-06-21 17:09:17
1084
原创 偏向锁是否一定比自旋锁效率高?
【摘要】Java中偏向锁与自旋锁的效率取决于应用场景。偏向锁在单线程独占时性能最优(接近零开销),而自旋锁更适合短时低竞争场景(避免偏向锁的STW撤销)。高并发时两者均劣于重量级锁。实测显示:单线程下偏向锁比自旋锁快10倍,双线程交替时自旋锁快75%。优化建议根据竞争程度选择锁机制,可通过JVM参数调整或禁用特定锁类型。关键结论:无竞争用偏向锁,低竞争用自旋锁,高竞争需升级锁策略。(149字)
2025-06-21 13:59:27
329
原创 为什么有自旋锁还需要重量级锁?
自旋锁和重量级锁是并发编程中互补的两种同步机制。自旋锁通过忙等待实现低延迟,适用于短临界区操作和多核低竞争场景,但会消耗CPU资源;重量级锁通过线程阻塞节省CPU,适合高竞争或长时间操作。现代系统(如JVM)采用锁升级策略动态切换两者:无竞争时用偏向锁,低竞争时尝试自旋,高竞争时升级为重量级锁。这种分层设计平衡了响应速度与系统吞吐量,如同"快刀"与"重锤"协同工作,适应不同并发场景的需求。开发者需根据业务特点合理选择同步机制。
2025-06-21 13:56:09
900
原创 自旋锁什么时候升级为重量级锁?
Java中synchronized锁的自旋锁升级为重量级锁的条件主要包括:自旋次数超过默认10次阈值(可调整)、自旋线程数超过CPU核心数一半、锁持有时间过长或重入竞争加剧。升级后锁机制改为操作系统互斥锁,线程从自旋变为阻塞状态,但不可逆。优化建议包括:缩小同步代码块范围、使用读写锁替代方案、调整JVM参数。本质上这是对CPU资源浪费与线程阻塞开销的权衡,需根据具体场景选择优化策略。
2025-06-21 13:47:36
440
原创 Java中锁重入实现原理
Java锁重入机制对比:偏向锁通过线程ID匹配实现零成本重入;轻量级锁利用栈帧LockRecord链隐式计数,适用于低竞争场景;重量级锁通过Monitor递归计数器实现,适合高并发但开销较大。三者分别针对单线程独占、低竞争短任务和高竞争长任务场景设计,其中锁升级不可逆。最佳实践建议根据具体场景选择合适锁机制,或通过禁用偏向锁、减小锁粒度优化性能。
2025-06-21 13:32:34
701
原创 StringBuffer和StringBuilder
StringBuffer和StringBuilder都是Java中处理可变字符串的类,主要区别在于线程安全性。StringBuffer的方法使用synchronized修饰,适合多线程环境;StringBuilder无同步机制,单线程下性能更高(测试显示速度可达StringBuffer的2倍)。建议:单线程优先使用StringBuilder,特别是循环拼接、动态SQL等场景;多线程才选择StringBuffer。注意预设容量可优化性能,避免直接使用String拼接。
2025-06-21 13:09:56
939
原创 Java中的synchronized
Java的synchronized关键字是解决多线程并发问题的核心机制,主要实现线程互斥、内存可见性和有序性。其底层通过对象头的MarkWord和Monitor管程实现,JDK6后引入偏向锁、轻量级锁和重量级锁的升级机制以优化性能。编译器和代码层可通过锁消除、锁粗化、减小锁粒度等措施进一步提升效率。相比ReentrantLock,synchronized更简单但功能有限,适用于低竞争场景。使用时需注意死锁风险、锁对象混淆等问题,在高并发场景可考虑替代方案。合理使用synchronized能有效构建线程安全的
2025-06-21 13:04:54
810
原创 join与CountDownLatch和CyclicBarrier
在高并发场景下,Java的Thread.join()方法因其灵活性不足、功能单一和性能问题,逐渐被java.util.concurrent包中的CountDownLatch和CyclicBarrier替代。
2025-06-21 10:23:52
912
原创 Java中wait和join方法
Java多线程编程中,wait()和join()都是线程协作方法,但存在关键差异:wait()是Object类方法,需在同步块中调用并释放锁,依赖手动通知唤醒,用于线程间条件协作;join()是Thread类方法,无需同步上下文,通过隐式唤醒实现线程顺序控制,常用于主线程等待子线程结束。join()底层利用wait()机制实现,当目标线程结束时自动唤醒。使用场景方面,wait()适用于生产者-消费者等条件协作模型,join()适用于线程执行顺序控制。注意事项包括避免死锁、处理中断及考虑更现代的并发工具替代方
2025-06-21 10:19:20
770
1
原创 Java中的锁升级过程
Java锁升级机制是JVM对synchronized的优化策略,通过无锁→偏向锁→轻量级锁→重量级锁的不可逆升级路径,动态适应不同竞争强度。偏向锁优化单线程重复访问,轻量级锁通过CAS自旋应对低竞争,重量级锁则处理高竞争场景。开发中需合理设计同步块,减少临界区长度,并监控锁状态。该机制在保证线程安全的同时最大化性能,但需注意偏向锁延迟启用和重量级锁不可降级等特性。理解锁升级有助于定位并发瓶颈和优化同步策略。
2025-06-21 10:02:35
1344
原创 常用公私钥格式解释
公钥常用格式包括PEM(带标记的文本)、DER(二进制)、Base64(纯编码)和SSH格式(带算法前缀)。PEM包含Base64编码的DER数据,适合配置文件;DER体积小,适合网络传输;SSH格式专用于认证场景。开发中建议优先使用PEM,注意公钥可公开传递但需验证来源,私钥必须加密存储。不同格式可通过工具转换,如OpenSSL生成PEM。选择格式需考虑应用场景,如嵌入式系统用DER,Git认证用SSH格式。
2025-06-16 18:34:52
1213
原创 Java中的CAS与ABA
《Java中CAS机制、ABA问题及Android应用解析》摘要: 本文通过图书馆占座类比通俗讲解CAS(CompareAndSwap)原理,即通过CPU指令实现原子性值替换。针对CAS可能出现的ABA问题(数据隐形篡改),提出用版本号(AtomicStampedReference)解决方案。在Android开发中,CAS常用于全局计数器(无锁性能优化)、状态标记(轻量同步)和ViewHolder复用(防ABA)。注意事项包括避免主线程自旋导致ANR,推荐优先使用原子类替代锁。总结指出CAS是并发编程基石,
2025-06-15 21:41:40
548
原创 Java垃圾回收机制
本文用生动类比解析Java垃圾回收机制(GC):将堆内存比作玩具仓库,GC是自动清洁工,通过可达性分析(寻宝游戏)识别无引用对象为垃圾。重点介绍了四种清理策略:标记-清除(产生碎片)、复制算法(适合新生代)、标记-整理(适合老年代)和主流的分代收集策略。文章对比了Serial、Parallel、CMS等不同GC收集器的适用场景,并给出优化建议:减少垃圾产生、合理配置堆大小、选择合适的收集器。最终指出GC的本质是智能内存管理系统,让开发者能专注于业务逻辑而非内存管理。全文通过生活化比喻,使复杂的GC原理变得通
2025-06-15 21:34:46
515
原创 Java对象中的MarkWord
Mark Word是Java对象的智能身份证,既存储身份信息(哈希码/年龄),又动态反映当前状态(锁类型),以最小空间支撑JVM的高效运行。
2025-06-15 21:29:13
1050
原创 CountDownLatch与CyclicBarrier的区别
CountDownLatch 和 CyclicBarrier 都是 Java 并发包中用于线程协作的工具类,但它们在设计目的、使用机制和适用场景上有本质区别。一句话记忆:CountDownLatch:主等子,一次性,如“司机等乘客到齐发车”;CyclicBarrier:子等子,可循环,如“运动员等所有人到起跑线开跑”。
2025-06-15 21:17:15
911
原创 双重检查单例
Java 中每个线程都有自己的工作内存(类似 CPU 缓存),对变量的修改会先保存在工作内存中,之后才会同步到主内存。为了提高性能,JVM 可能会对指令进行重排序(Reordering)。例如,它可能先执行步骤 1 和 3(分配内存并赋值),。直接强制所有读写操作都发生在主内存中,跳过了线程的工作内存。可以保证线程安全,但它会导致每次调用。变量后,JVM 会禁止对这个变量的。,后续调用直接返回实例,性能更高。锁的是类对象,确保线程安全。,要么是已完全初始化的对象。这样,所有线程看到的。
2025-05-13 09:13:09
612
原创 技嘉主板BIOS升级
结合上面看到的主板信息下载去技嘉官网下载对应BIOS,fat格式的U盘存放解压好的bios文件。注意技嘉主板BIOS不能跨版本升级,需要一个一个版本往上升。截图可能不同的BIOS长的不一样,但大概相同,BIOS不下错,逐个版本升级就没问题。如下为Z390 GAMING X (rev1.0)去BIOS设置里面,看。开机->Del键 进入BIOS设置界面。4. 点击update bios 进入选择bios页面。5.选择好 bios,按回车键,等待验证完。这里漏了一个页面,默认选中的就可以,回车键。
2025-05-10 20:37:53
6159
原创 WebStorm引用的npm包内方法无法点击跳转进入
如图,打开WebStorm右下角找到TypeScript Service,重启Service或者打开Service,重启WebStorm即可。
2025-04-21 18:39:05
465
原创 ViewStub
ViewStub是Android中用于延迟加载布局的轻量级组件,通过占位替换机制优化性能。它仅消耗约1KB内存,在调用inflate()或setVisibility()时才加载目标布局并替换自身。优点包括减少启动耗时、降低内存占用和布局解耦;缺点是加载后不可复用且功能有限。源码显示其通过零尺寸测量和替换父视图实现延迟加载。适用于低频显示的场景(如错误页),但不适合频繁显隐的视图。正确使用可显著提升界面响应,尤其对低端设备效果明显。
2025-04-18 14:32:43
295
原创 typescript中使用类并且声明成员变量后,本地运行会报 Unexpected token = 错误
typescript中使用类并且声明成员变量后,在UC浏览器中运行会报 Unexpected token = 错误。lib中的esnext改成ES2015,增加target:ES2015。
2024-06-20 19:54:56
470
1
原创 Android FileProvider笔记
通过FileProvider.getUriForFile(@NonNull Context context, @NonNull String authority, @NonNull File file)方法获得一个有临时权限的Uri给客户端用来访问本APP文件。当然看FileProvider类的注释更加详细。
2023-09-19 19:37:13
942
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅