- 博客(15)
- 收藏
- 关注
原创 在RocketMQ中,如何确保消息的顺序性?
如果需要严格按照FIFO原则处理消息,即先发送的先消费、后发送的后消费,则必须同时满足生产顺序性和消费顺序性。通过上述措施,RocketMQ能够在高并发场景下保证消息的顺序性,满足业务对于消息顺序传递的需求。
2024-10-21 12:59:16
204
1
原创 如何保证RocketMQ的高并发场景下的消息不丢失?
消息重试时,消费端一定要做好幂等处理。如果消费端由于异常崩溃等原因未能发送消费确认,RocketMQ会重新将消息投递给消费端,确保消息被正确消费。消息首先发送到主节点,主节点将消息写入磁盘后,异步地将消息复制到从节点。通过上述机制的综合运用,RocketMQ能够有效地保证在高并发场景下消息不会丢失,并且具有较高的可靠性和稳定性,适用于各种对消息传递可靠性要求较高的场景。:RocketMQ提供了事务消息的支持,确保消息的发送和业务处理的原子性,如果业务处理失败,消息可以回滚,从而保证消息不会丢失。
2024-10-21 12:57:19
431
原创 cms和g1的回收过程是什么
G1垃圾回收器的一个关键特点是它将堆内存划分为多个区域(Region),并根据这些区域的回收价值进行优先级排序,从而优先回收垃圾最多的区域,以实现高吞吐、低停顿的收集效果。G1在进行垃圾回收时,会根据设定的停顿时间进行智能的筛选和局部的回收,采用“标记-复制”算法来实现,这样可以避免内存碎片的产生。CMS(Concurrent Mark Sweep)和G1(Garbage First)都是Java虚拟机中的垃圾回收器,它们在垃圾回收策略和实现上有所不同。
2024-10-21 12:35:58
646
原创 mysql在可重复读下,怎么解决的幻读
快照读通过MVCC机制,确保事务在其生命周期内看到的数据是一致的。当前读通过Next-Key Locking机制,锁定查询范围内的记录及其间隙,防止其他事务在这些间隙中插入新记录。虽然这些机制在很大程度上解决了幻读问题,但在某些极端情况下,幻读仍然可能发生。因此,在实际应用中,可能需要根据具体需求和场景,选择合适的隔离级别和锁机制来确保数据一致性。
2024-10-21 12:27:17
632
原创 spring为什么使用三级缓存来解决循环依赖
这是早期的单例缓存,用于存储尚未完全初始化的Bean实例。这个缓存中存放的是已经实例化,但还没有完成属性填充和初始化的Bean,它们可以被其他Bean引用,以解决循环依赖问题。Spring框架使用三级缓存机制来解决循环依赖问题,主要是因为这种机制可以有效地处理单例Bean和原型Bean之间的复杂依赖关系,同时保持Spring对Bean生命周期的精确控制。总结来说,Spring的三级缓存机制是为了解决循环依赖问题而设计的,它通过这种机制可以更有效地处理复杂的Bean依赖关系,提高系统的稳定性和可靠性。
2024-10-21 12:08:53
329
原创 美团java面试灵魂9连问
指令重排,第一题中我们得知对象的创建过程,这个过程可能会造成指令重排问题,所以要想完全避免,需要根据你的业务场景判断是否增加 volatile 关键字。对象和数组的存储不同,对象在内存中主要有四种类型,markword,classpoint ,instance data, padding。第三步:内存不大,进入线程本地缓冲区(TLAB),然后进入Eldn(新生代).第二步:通过该对象的构造器,将对象原本初始值赋值给内存空间。第一步:尝试栈上分配,分配成功,对象随栈信息一起pop。空间,将对象实例属性。
2024-01-26 14:46:37
399
1
原创 锁的一些简单理解
2、ByteCode字节码 ACC_VOLATILE。无锁 (new对象)-> 偏向锁(在门上贴个名字) -> 自旋锁(多线程抢进行CAS) -> 重量级锁 (人太多了,近队列)3、JVM虚拟机规范 JVM内存屏障。屏障两边的执行不可以重排!软引用(内存不够用了,回收软引用)弱引用(垃圾回收器看到就回收)虚引用(管理堆外内存,零拷贝)3、JVM的内存屏障。
2024-01-26 14:33:03
306
1
原创 CAS与ABA
否则,不要更改该位置,只告诉我这个位置现在的值即可。当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁,或者有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。,它假设冲突比较少,但使用CAS 更新,进行冲突检测,如果确实冲突就继续尝试直到成功,它是非阻塞式算法,有更新冲突就重试。,它假设更新都是可能冲突的,所以要先获取锁,得到锁才更新,它是阻塞式算法,得不到锁就进入锁池等待。
2024-01-24 14:29:29
792
1
原创 Object o=new Object()在内存中占用多少字节
这参数后面的oop可不是面向对象编程Object Oriented Programming的意思,而是普通对象指针Ordinary Object Pointer。启用每个Class的属性指针(静态成员变量);每个对象的属性指针;普通对象数组的每个元素指针。当然,压缩也不是所有的指针都会压缩,对一些特殊类型的指针,JVM是不会优化的,例如指向PermGen的Class对象指针、本地变量、堆栈元素、入参、返回值和NULL指针不会被压缩。
2024-01-24 11:59:58
1287
1
原创 Java Collections.shuffle方法(用来抽奖很好用)
是一个Java Collections类方法,其工作原理是随机置换指定列表元素。有不同类型的Java shuffle()方法,可以根据其参数进行区分。shuffle(list)方法用于通过使用默认随机性对指定的列表元素进行随机重新排序来工作。shuffle(list,random)方法用于通过使用指定的随机性对列表元素进行随机重新排序来工作。该方法不返回任何东西。
2024-01-24 10:35:38
741
1
原创 Js-基础语法学习-push()方法
1. push() 方法用于向数组的末尾添加一个或多个元素。2. push() 方法将改变原数组的长度。2. item :插入数组中的元素值。往数组的尾部插入一个元素。往数组的尾部插入多个元素。
2024-01-16 10:21:45
406
1
原创 Js-基础语法学习-splice()方法
2. howmany :可选。若不填,则默认删除从index直到数组结尾所有元素。替换数组中从下标为1开始的一共三位元素为item1、item2、item3。1. splice() 方法用于添加或删除数组中的元素。删除数组中从下标为index开始直到结尾的所有元素。1. index : 必填。从何处开始添加或删除。3. item :用于替换的时候替补的值。2. splice() 方法会改变原数组。删除数组中最后一位元素。
2024-01-16 10:19:02
515
1
原创 Js-基础语法学习-unshift()方法
1. unshift() 方法用于向数组的开头插入一个或多个指定元素。2. unshift() 方法将改变原数组的长度。
2024-01-16 09:56:37
1785
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人