- 博客(308)
- 收藏
- 关注
原创 Java类字节码 详解 深入浅出 面试题 用verbose工具查看字节码
首先,我会回顾Java字节码的基础知识,确保自己理解每个操作码的作用。例如,iconst_1将整数1压入操作数栈,istore_1将栈顶的int值存储到局部变量表的位置1。iload_1则是将局部变量位置1的值压入栈顶。这些基本操作需要正确理解才能分析整个流程。接下来,我需要分析方法的整体结构。方法foo()的返回类型是int,描述符为()I,访问标志为ACC_PUBLIC,说明这是一个公共方法。Code属性中给出了操作数栈的最大深度(stack=1),局部变量数量(locals=5),以及参数数量(a
2025-02-08 01:35:06
497
原创 Java并发编程 优化卖票案例 FieldUpdater 对象的属性修改原子类 以一种线程安全的方式操作非线程安全对象内的某些字段
无锁机制:compareAndSet方法通过CAS(Compare-And-Swap)操作实现原子更新,不需要加锁,减少了线程阻塞和上下文切换的开销。AtomicReferenceFieldUpdater:基于CAS的无锁机制,线程直接尝试更新,只有冲突时才会重试,避免了阻塞。AtomicReferenceFieldUpdater:在大多数情况下,CAS操作非常高效,尤其适合读多写少的场景。synchronized:基于锁的机制,线程需要等待获取锁才能执行临界区代码,可能导致阻塞。
2025-02-08 00:28:45
469
原创 并发编程 引用类型 原子类 Stamped和Markable atomicMarkableReference表单Ref和标记Markable 面试题
AtomicMarkableReference 是一个位于 java.util.concurrent.atomic 包中的类。它提供了一种原子性的方式来管理一个带有标记的引用。这在一些需要同时跟踪对象引用和一个标记状态的场景中非常有用,例如实现乐观锁机制或者在多线程环境下标记某个对象的特定状态。
2025-02-06 12:54:41
179
原创 Java并发编程 原子 Atomic 基本类型 CountDownLatch阻塞 数组类型 原子类 AtomicIntegerArray 看源码自我学习
类在多线程环境下的强大功能,它可以确保对数组的操作是原子的,从而避免数据竞争和不一致的问题。提供的方法可以确保在多线程环境下的操作是原子的,即不会发生数据竞争或不一致的问题。提供了一些基本的操作方法,如获取、设置、自增、自减等。)中的一个类,它提供了一种线程安全的方式来操作整数数组。与普通的整数数组不同,countDownLatch 会等线程完成一个后自减。以下是一个完整的示例,展示了如何使用。输出的结果会小于等于 50000。50 个线程去加 100 次。通过这些示例,你可以看到。
2025-02-06 12:53:48
470
原创 并发编程 CAS的缺点 ABA问题是什么 以及解决 版本号机制
但是已经是被 线程 1 修改成 101 后又改了回去。成功是成功的 但是不代表没有问题。发现不一样 本次操作会写不进去。线程 2、会以为还是 100。cas 原值和期望值是否一样。会存在 CPU 空转的问题。100 100 这个数值。杜绝 ABA 这种情况。传入整型数 表示版本号。我们有一种版本号机制。
2025-02-06 12:52:27
205
原创 并发编程 Java锁 自旋锁 原子引用类 AtomiacReference
自旋锁(spinlock)是一种在多线程或多进程环境下用于同步和控制并发访问共享资源的机制。它是一种繁忙的等待方式,当线程试图获取自旋锁时,如果锁已经被其他线程持有,那么这个线程不会进入睡眠状态,而是在一个循环中反复地检查(等待),直到锁可用为止。例如,在循环中通过执行类似空for循环这样无用的任务来保持活动状态,就像一个人在等待某个资源时不停地转圈查看是否可以获取一样,这也是“自旋”名称的由来1。
2025-02-06 12:51:40
521
原创 Java并发编程 CAS思想 底层原理 Unsafe类 不安全 并发原语 OpenJDK源码
volatile无原子性,会写丢Atomiclnteger 类主要利用 CAS(compare and swap)+ volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。volatile管不住,会写丢,因为写操作只会有一次,如果这次写操作和其他线程冲突了,就会无效但是CAS如果写不进去会一直循环,直到写进去为止。
2025-02-06 12:49:46
600
原创 Java并发编程面试题 重点 volatile变量的读写过程 可见性 无原子 禁重排 八步读取 四大内存屏障指令
线程t1中为何看不到被主线程main修改为false的flag的值?问题可能:1.主线程修改了fag之后没有将其刷新到主内存,所以t1线程看不到。2.主线程将faq刷新到了主内存,但是t1一直读取的是自己工作内存中fag的值,没有去主内存中更新获取fag最新的值。我们的诉求:1.线程中修改了工作内存中的副本之后,立即将其刷新到主内存:2.工作内存中每次读取共享变量时,都去主内存中重新读取,然后拷贝到工作内存。解决:使用volatile修饰共享变量,就可以达到上面的效果,被volatile修改
2025-01-26 02:12:28
677
原创 volatile之四类内存屏障指令 内存屏障 面试重点 底层源码
当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量所以volatile的写内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取。Java 操作内存的后门重排是为了优化性能而发生的一种行为,但在多线程环境中,若没有正确的同步机制,重排可能导致程序行为不一致,尤其是在共享数据的访问上。为了防止这类问题,我们通常会使用volatile。
2025-01-26 02:10:52
640
原创 JUC 复习和巩固 并发并行 Stream并行流 park能不能用interrupt打断 synchronized 和 lock 优势
parallel()实际上是基于来实现并行计算的。通过将数据划分为多个子任务并在多个线程上执行来提高性能。需要注意,并非所有操作都适合并行处理,应该根据具体情况进行优化。中使用之所以会导致线程不安全,主要是因为ArrayList(或其他常见的List实现类)并不是线程安全的。这意味着当多个线程同时执行add()操作时,可能会发生竞争条件(race condition),导致数据不一致或程序异常。在并行流中会导致线程不安全,因为ArrayList。
2025-01-26 02:10:17
924
原创 Java内存模型JMM happens-before关系 先行发生原则 八条原则 修复案例 总原则
一个unLock操作先行发生于后面((这里的“后面”是指时间上的先后))对同一个锁的lock操作;如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C。对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;一个线程内,按照代码顺序,写在前面的操作先行发生于写在后面的操作;前面的写对后面的读是可见的,这里的“后面”同样是指时间上的先后。
2025-01-26 02:09:31
755
原创 结合计算机组成原理讲 Java内存模型JMM JMM规范下多线程对变量的读写过程
CPU 比内存速度快为了避免数据不一致性的问题就有 了 CPU 缓存Java 语言是跨平台的Java 虚拟机规范中试图定义一种 Java 内存模型 来屏蔽掉各种硬件和操作系统的内存访问差异 以实现让 Java 程序在各种平台下都能达到一致的内存访问效果我们习惯性认为代码执行顺序是从上到下有序执行处理器在进行重排序的时候必须考虑指令之间的数据依赖性图JMM 定义了线程和主内存之间的抽象关系线程之间的共享变量存储在主内存中(内存条)每一个线程都有一个私有的本地工作内存。
2025-01-26 02:08:54
286
原创 灵魂拷问 线程中等待唤醒机制 park() unpark() 如果要阻塞两次怎么办
问 如果我们在调用方法的时候 service 里面的业务线很长 我们是否可以开两个线程去处理 业务请求 使用阻塞唤醒的方式 决定先处理还是后处理?一个线程只能针对于一个线程发起一个 unpark。是一个及其消耗 CPU 的操作。多线程的上下文切换?非阻塞的 无锁化机制。
2025-01-23 02:01:14
361
原创 LockSupport类中的park等待和unpark唤醒
LockSuppont是用来创建锁和其他同步类的基本线程阻塞原语。线程等待推荐使用 park() unpark() 机制。这边等效是只发一个 unpark 通行证。阻塞当前线程 / 阻塞传入的具体线程。唤醒处于阻塞状态的指定线程。最多 1 个 最少 0 个。许可上限的累加是 1。
2025-01-23 02:00:38
223
原创 ReentrantLock类中的lock以及Condition接口中的await和signal方法
跟刚才其实是一样的。ReentrantLock类中的lock以及Condition接口中的await和signal方法
2025-01-23 02:00:01
175
原创 Object类中的wait和notify方法实现等待唤醒机制
目录LockSupport 高级等待唤醒的三种方法发展历程wait() notify()代码输出总结park()unpark()两个方法输出wait() 和 notify() 方法只能在synchronized{} 代码块里面使用否则会报错报 moniter illegality 管程不合法的 错所以 wait() 和 notify() 方法必须要去锁资源会阻塞wait() 和 notify() 的顺序不能错如果在 notify() 之后 wait() 那就会阻塞
2025-01-23 01:59:22
325
原创 Java并发编程高级 难点 多线程中断机制 中断机制 volatile变量 原子类 Thread自带API interrupt()和isInterrupt()
首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop,Thread.suspend, Thread.resume 都已经被废弃了。其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制--中断。中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。
2025-01-23 01:58:47
744
原创 Java锁 死锁及排查 JVM 工具 jconsole 工具 排查死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力于涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足。死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
2025-01-19 18:56:49
535
原创 Java锁 可重入锁(递归锁) 深入源码解析 ReentrantLock synchronized
当执行monitorenier时,如果目标锁对象的计数器为零,那么说明它没有被其他线程所持有,Java虚拟机会将该锁对象的持有线程设置为当前线程,并且将其计数器加1。是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还。在目标锁对象的计数器不为零的情况下,如果锁对象的持有线程是当前线程,那么Java虚拟机可以将其计数器加1,否则需要等待。每个锁对象拥有一个锁计数器和一个指向持有该锁的线程的指针。自己可以获取自己的内部锁。
2025-01-19 18:56:15
265
原创 CSDN九年码龄追光逐梦:一个00后程序员的技术与成长之路
时光飞逝,转眼间已在CSDN这个平台记录了九年的技术点滴。从最初接触Swing开发时的懵懂,到如今在架构设计中游刃有余;从曾经仰望开源项目的憧憬,到现在已能为社区贡献代码。这一路走来,每一个尝试都是成长,每一次失败都是财富。记得在CSDN发布第一篇文章时的忐忑,生怕自己理解有误而贻笑大方。但正是这份分享的心意,让我遇到了许多志同道合的朋友。在评论区的讨论中,我不仅收获了宝贵的建议,更感受到了技术社区的温暖与包容。作为一名出身于计算机世家的90后程序员,我深知肩上的责任与期待。
2025-01-18 22:14:55
762
原创 Java锁 公平锁和非公平锁 ReentrantLock() 深入源码解析
而公平锁要判断同步队列是否有先驱节点存在。程序中的公平性也是符合请求锁的绝对时间。生活中排队讲求先来后到视为公平。也可以传入一个true参数。否则那就用公平锁大家公平使用。如果没有先驱节点才能获取锁。很显然非公平锁是比较合适的。因为节省了很多线程切换时间。运行后全是a对象获取。如果是为了更高的吞吐量。我们现在有五个售票员。默认是使用的非公平锁。
2025-01-18 22:01:04
326
原创 Sync底层字节码 monitorEnter和monitorExit 对象监视器
ObjectMonitor中有几个关键属性。Object类是Java所有类的父类。那么只有一个enter和exit。跟同步方法相比多了一个静态的标识。保证异常over也会解锁。每一个对象都有一个对象监视器。
2025-01-18 22:00:01
259
原创 Java中的 锁现象演示和原理解释 多线程操作资源类 八种案例 同步方法 静态方法 对象锁 类锁
我们要明白sync锁定的是什么阿里开发手册能用对象锁就不要用类锁synchronized不是锁方法是锁资源类同步方法资源类是对象同步静态方法资源类是当前类同步方法锁的是当前对象同一时间只能允许一个线程进来同步方法不允许同时普通的同步方法锁的是对象锁对象.class静态的同步方法锁的是模版类锁类.class能用对象锁就不要用类锁。
2025-01-18 21:59:07
572
原创 JUC Java并发编程 并发编程三大特性 原子性 可见性 有序性
在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。一个很经典的例子就是银行账户转账问题:比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。试想一下,如果这2个操作不具备原子性,会造成什么样的后果。假如从账户A减去1000元之后,操作突然中止。然后又从B取出了500元,取出500元之后,再执行往账户B加上1000元的操作。这样就会导致账户A虽然减去了1000元,但是账户B没有收到这个转过来的1000元。
2025-01-18 21:58:31
615
原创 Java锁 从乐观锁和悲观锁开始讲 面试复盘
要通过不同的实现方式进行不同操作。乐观锁认为自己在操作数据的时候不会有别的线程修改数据,所以不会加锁,所以他只会在自己操作数据的时候检查是否有其他线程修改更新的这个数据。这种方式在判断和更新之间,确保了只有一个线程能够成功更新值,其他线程则会重试或失败,从而保证了乐观锁的行为。,在方法级别加锁时,锁是针对该对象的,保证同一时刻只有一个线程能够执行该方法。相对较低,特别是在高并发环境下,由于JVM的锁优化不足,可能导致性能瓶颈。可以通过锁的竞争情况动态升级为不同的锁类型(如偏向锁、轻量锁、重量锁)。
2025-01-18 21:57:25
765
原创 Java算法 八股 Javase Set集合类 编译看左边 运行看右边 详解TreeSet和HashSet
TreeSet是一个有序的集合,基于红黑树实现,支持高效的元素查找和排序相关的操作。它提供了许多与元素顺序和范围查询相关的方法,如higher()lower()ceiling()floor()等。HashSet是一个无序的集合,基于哈希表实现,适用于需要快速查找、添加、删除操作的场景。它提供了一些与元素存在性和集合操作相关的方法,如contains()add()remove()clear()等。根据你的需求选择合适的集合类,可以在保证性能的同时满足功能需求。编译时看左边。
2025-01-17 22:00:37
808
原创 Java算法 二叉树入门 力扣简单题相同的树 翻转二叉树 判断对称二叉树 递归求二叉树的层数
根节点左孩子节点右孩子节点。左孩子节点根节点右孩子节点。左孩子节点右孩子节点根节点。
2025-01-17 21:59:42
609
原创 CompletableFuture 速优选和对计算结果进行合并(消费) thenAccept() thenApply() thenRun() applyToEither() applyCombine(
thenAccept()方法注意到的是接收任务的处理结果并做消费处理没有返回结果。thenAccept()方法注意到的是接收任务的处理结果并做消费处理没有返回结果样例 applyToEither()哪个线程快 用谁两个线程都会执行结束样例 applyCombine()thenCombine 一个线程拿到数据后 会等待另一个数据获取结束比如说我们可以调用两个第三方接口统一把结果返回给前端聚合多个服务台数据
2025-01-16 20:19:14
318
原创 CompletableFuture 常用方法对计算结果进行处理 thenApply() handle() whenComplete()
阶段性提交代码 thenApply()串行化调度 开发thenApply( )方法计算结果存在依赖关系将这两个线程串行化由于存在依赖关系 (当前步错 不走下一步)当前步骤有异常的话就叫停
2025-01-16 20:18:23
251
原创 CompletableFuture 常用方法获取结果和触发计算 complete() get() getNow()
/ 创建线程池2, // 核心线程数4, // 最大线程数60, // 线程空闲时间(单位秒)TimeUnit.SECONDS, // 时间单位new LinkedBlockingQueue(10) // 队列容量// 关闭线程池。
2025-01-16 20:17:35
230
原创 CompletableFuture案例 电商平台需求 解读分析
转换成 List< CompletableFuture >再用 CompletableFuture 的 join 方法。netMall 是 list 里面的每一个对象。转换成 List把 List可以用 Stream 流去写。用 map 映射出来。
2025-01-16 20:16:51
248
原创 大厂真实业务需求 电商平台对外网站的比价 单线程同步获取 多线程异步获取
然后再开 Stream 使用 CompletableFuture 的 join 方法。要求找出全部商家卖同款 book 的列表。通过CompletableFuture。先 开 Stream 流获取数据。对内微服务多系统的调用。拿到数据后 转化为集合。淘宝网入驻了很多商家。商家都在卖 book。
2025-01-16 20:16:14
269
原创 双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]
Deque 是一个接口LinkedList 是这个接口的实现类。集合 关系 介绍Deque 是一个接口LinkedList 是这个接口的实现类
2025-01-15 19:13:21
481
原创 Java 数据结构 队列之双端队列 常用方法 示例代码 及其实现
Java中的双端队列(Deque,Double Ended Queue)是一种队列,它允许在队列的两端插入和删除元素。与普通队列(FIFO)不同,双端队列的元素可以从队列的两端进行添加或删除。Java提供了Deque接口,它扩展了Queue接口,常见的实现类有ArrayDeque和LinkedList。
2025-01-15 19:11:57
388
原创 Java算法 数据结构 栈 单调栈实战 模版题 [洛谷-P5788]
【代码】Java算法 数据结构 栈 单调栈实战 模版题 [洛谷-P5788]
2025-01-15 18:37:26
503
原创 Java算法 数据结构基础 并查集 模版 [洛谷-P3367]
并查集(Union-Find)是一种数据结构,主要用于处理一些不交集的合并及查询问题,特别是在图论中用来解决连通性问题。查找(Find):判断某个元素属于哪个集合,返回该集合的代表元素(根)。合并(Union):将两个集合合并成一个集合。并查集通过路径压缩和按秩合并来优化效率,减少操作的时间复杂度。
2025-01-15 18:36:54
946
原创 学会使用开源软件jclasslib 字节码文件的组成 详解
github 地址https://github.com/ingokegel/jclasslib工具使用基本信息常量池字段方法属性详解公式给出的版本 52-44=8 Jdk8需要的版本 50-44=6 Jdk6比较
2025-01-14 23:15:31
160
原创 JVM虚拟机的组成 笼统理解 六大部分 类加载子系统 运行时数据区 执行引擎 本地接口 垃圾回收器 线程工具
JVM是Java平台的核心,负责执行Java字节码。其作用是提供跨平台的运行环境,使得Java程序可以在任何支持JVM的操作系统上运行,而不需要关心底层硬件。JVM的组成包括多个子系统,协同工作以确保程序的正确性和高效性。关键组成部分包括类加载子系统、运行时数据区、执行引擎、垃圾回收器、本地接口、线程管理及调试工具等。
2025-01-14 23:14:53
915
原创 初识JVM HotSopt 的发展历程
目录导学目前企业对程序员的基本要求面向的对象实战学习目标JVM 是什么JVM 的三大核心功能各大 JVMlook 看一下虚拟机HotSopt 的发展历程总结即时编译主要是实现跨平台特性
2025-01-14 23:12:55
339
原创 CompletableFuture 异步编排演示 减少阻塞和轮询
我们可以传入回调对象当异步任务完成或者是发生异常的时候自动调用回调对象的回调方法太多方法了及其强大。
2025-01-14 18:08:16
376
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人