- 博客(27)
- 收藏
- 关注
原创 JVM 之 String 引用机制解析:常量池、堆内存与 intern 方法
注意:在 JDK6 中,intern() 返回的始终是常量池中的对象,而不是堆中的新对象,因此结果为。JDK7+ 才有将堆对象放入常量池的可能。
2025-04-11 18:50:31
202
原创 JVM之类的加载过程
这一阶段是将类的字节码从外部存储(如磁盘)加载到JVM的内存中。加载时,JVM会根据类的全限定名(包括包名和类名)查找相应的字节码文件(初始化阶段是类的静态代码块和静态变量的初始化过程。JVM会执行类中的静态初始化块()和静态字段的初始化操作。初始化是唯一会改变类的状态的阶段,它是类加载的最后一步。文件),并将其读入内存。
2025-03-25 16:26:04
356
原创 Java并发编程之Fork/Join
如果任务规模过大,则将其拆分成多个更小的子任务。这个拆分过程通常是递归的,直到子任务规模足够小,可以直接计算。由于采用了工作窃取算法,即使某些线程任务执行完毕,空闲的线程也可以“窃取”其他线程的子任务,进一步提高并行度。这样做会将两个子任务都异步提交给线程池,然后当前线程等待这两个任务执行完毕。每个子任务完成后,其结果会返回给父任务,父任务将这些子任务的结果进行合并,最终返回整个大任务的计算结果。每个任务返回其计算结果,父任务通过合并这些结果来得到整个数组的总和。将左边的子任务异步提交到线程池。
2025-03-20 16:51:00
363
原创 Java并发编程之CyclicBarrier
在创建时,需要指定参与线程的数量。还可以提供一个Runnable类型的屏障动作,当所有线程到达屏障时,该任务会被自动执行。每个线程在执行到需要同步的代码时,调用await()方法等待其他线程。当最后一个线程调用await()时,屏障打开,所有线程被同时释放,继续执行后续任务。(类似于中的,使计数器减1)在这个示例中,每个线程在到达屏障点后都会调用await(),当最后一个线程调用后,屏障打开,所有线程都同时继续执行。
2025-03-20 10:50:04
408
原创 Java并发编程之CountDownLatch
常见于主线程等待多个子线程完成各自的任务后,再进行汇总或后续处理。例如,启动多个任务加载数据,主线程在所有任务完成后开始处理数据。当前线程调用此方法后,会等待直到计数器归零。例如,所有线程等待一个“发令枪”信号后同时开始执行任务。每当一个任务完成时,调用此方法,将计数器减 1。一旦计数器为 0,所有等待的线程都会被释放。这个值通常代表需要等待完成的任务数或线程数。计数器归零后,主线程被唤醒,继续执行后续代码。的计数器只能使用一次,归零后不能重新设置。,否则等待的线程可能永远无法被唤醒。
2025-03-20 10:42:32
420
原创 Java并发编程之Semaphore信号量
Semaphore 常用于实现对有限资源的访问控制,通过许可的获取和释放来管理资源的并发访问。Semaphore 在构造时设定一个许可数量,这个数量表示可以同时访问共享资源的线程数。在这个例子中,Semaphore 被初始化为 3,因此最多允许 3 个线程同时访问。Semaphore 支持公平和非公平两种模式。时,它将会阻塞,直到其他线程调用。当第 4 个线程调用。
2025-03-19 17:36:20
293
原创 Java并发编程之StampedLock
每次获取锁(无论是读锁、写锁还是乐观读锁)时,都会返回一个 stamp,这个 stamp 内部编码了当前锁的状态(包括版本信息)。获得一个乐观读锁时,会返回一个 stamp。方法时,会返回一个 stamp,这个 stamp 表示一个“乐观”状态。方法获取写锁,返回一个 stamp,释放时需要传入这个 stamp。,表示期间有修改,读取的数据可能不一致,通常退化为读锁重新读取数据。方法获得读锁,同样返回一个 stamp,用于后续的释放操作。在进行乐观读时,先获取 stamp,然后执行读操作,最后使用。
2025-03-19 16:24:07
889
原创 Java并发编程之ReentrantReadWriteLock
多个线程可以同时持有读锁,只要没有线程持有写锁,这样可以允许并发读操作,从而提高系统并发性能。一次只有一个线程可以持有写锁,并且在写锁持有期间,其他线程无论是请求读锁还是写锁都会被阻塞。“独占内存”则意味着写操作必须保证独占访问,防止数据出现并发修改问题。“共享内存”指的是多个线程可以共享同一份数据的只读访问权限。方法,确保对共享资源的访问安全。在需要保护的代码块前后分别调用。方法获得读锁对象,使用。
2025-03-18 16:15:58
532
原创 Java并发编程之AQS
就是对 state 的显式设置,它保证只有一个线程能成功更新 state,从而获得锁。AQS 使用CAS操作来原子性地修改 state,从而保证并发场景下状态更新的安全性。AQS 内部通过一个。来记录当前同步状态。
2025-03-18 16:08:25
350
原创 Java并发编程之ThreadPoolExecutor构造
表示没有核心线程,线程不会被长期保留。如果任务提交速度超过线程池处理速度,未处理的任务会存放在队列中。,表示只有一个核心线程。,表示线程数可以无限扩展。:空闲线程会在 60 秒后被回收。当线程池无法处理新任务时(队列已满且线程数已达到。,任务直接提交给线程。,表示空闲线程不会被回收。,表示空闲线程不会被回收。时间内没有任务执行,则该线程会被回收。:默认线程工厂,线程名称格式为。:默认线程工厂,线程名称格式为。:默认线程工厂,线程名称格式为。
2025-03-16 16:00:07
344
原创 Java并发编程之synchronized有序性误区
许多开发者误以为能完全禁止指令重排序,而实际上它仅能保证线程间的操作顺序,禁用重排序需依赖volatile。
2025-03-12 16:42:25
776
原创 Java并发编程之Wait/Notify
通过wait()notify()wait():释放锁并等待条件满足。notify():通知等待线程条件已变化。正确使用这两个方法需严格遵循同步规则和条件检查,避免线程饥饿或死锁问题。拓展:wait与sleep1. 所属类与调用方式方法所属类调用方式wait()Object必须在同步块中调用(需持有对象锁)sleep()Thread静态方法,可直接调用(无需持有锁)2. 锁的释放行为方法是否释放锁?锁释放时机wait()✅释放锁调用wait()后立即释放锁,线程进入等待状态。
2025-03-07 19:28:34
676
原创 Java并发编程之锁膨胀
锁膨胀不可逆:一旦升级为重量级锁,不会降级(除非对象被回收后重新创建)。性能权衡轻量级锁:低开销(CAS + 自旋),适合低竞争场景。Monitor锁:高开销(涉及操作系统内核态切换),但避免CPU空转,适合高竞争场景。适应性自旋优化:JDK 6后JVM根据历史竞争情况动态调整自旋次数。
2025-03-07 15:09:01
492
原创 Java并发编程之interrupt中断阻塞正常线程
场景中断行为阻塞状态抛出,清除中断标志,需通过异常处理响应中断。正常运行状态仅设置中断标志位(),需手动检查标志位并决定是否终止。
2025-03-04 15:46:27
243
原创 SpringCloud-GateWay整合eureka实现网关转发
学习springcloud时,教程使用的是zuul,搜了半天访问还是404,一气之下直接使用gateway(bushi,而且Netfilex也停止维护了。
2024-09-19 22:20:49
481
1
空空如也
Vue2挂载模块没有名字,如何解决?(标签-学习)
2023-11-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人