自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 问答 (1)
  • 收藏
  • 关注

原创 什么是MVCC?

值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以 该版本。值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本。,说明创建ReadView时生成该版本的事务还是活跃的(未提交),该版本。,说明创建ReadView时生成该版本的事务已经被提交,该版本。如果被访问版本的trx_id属性值与ReadView中的。如果被访问版本的trx_id属性值在ReadView的。up_limit_id:活跃的事务中最小的事务 ID。如果被访问版本的trx_id属性值。

2024-04-15 18:06:25 310

原创 MySQL一条update语句的执行过程?

查询bufferpool是否有数据,如果没有则去磁盘查询并放入bufferpool,更新数据并将此数据页标记为脏页,将修改前的数据记录到undolog,将改动记录放入redologbuffer中,redologbuffer将数据记录到redolog中并将状态改为prepare,改动记录写入binlog,写完binlog后将redolog状态标记为commit,最后提交事务。客户端通过连接器与服务端进行连接。解析器解析sql语句生成语法树。优化器进行优化生成执行计划。调用存储引擎执行sql语句。

2024-04-15 18:04:34 259

原创 判断两个对象是否相同其实使用equals就可以了,为什么开发中我们一般还需要重写hashcode方法?

如果对象不对hashcode()进行重写,那么对象就会默认使用object类的hashcode(),这时可能出现对象并不是相等的但是恰巧hashcode值是相同的,就会导致错误的判断,当对象重写hashcode()后,会根据传入的属性进行计算得出对应的hashcode值,这时就可以保证对象相等才能计算出相等的hashcode值进而保证方法的准确性。两个对象相同意味着hashcode值一定是相同的,但是hashcode值相同不代表对象一定相同。

2024-04-01 18:29:00 149

原创 Spring的单例Bean的线程安全问题?

单例模式下,Spring IoC容器只会创建一个Bean实例,并且该实例会在整个应用上下文中共享,无论多少次请求该Bean,都只会返回同一个实例,这就造成成员变量在多线程的情况下出现线程安全问题,也就是多个线程创建的多个对象其实都是一个对象,操作的成员变量也是同一个,导致数据出现错误。使用threadlocal,将成员变量放到threadlocal中,因为threadlocal是本地线程变量,每个线程共享一份,所以就不会出现其他线程对当前线程的变量进行操作。

2024-03-31 20:08:32 198

原创 谈谈你对Spring框架的理解?(ioc和aop)

面向切面编程,AOP将与核心业务无关的一些代码独立抽取出来,形成一个切面,然后再以横向交叉的方式应用到我们的业务流程当中。对象创建:Spring IoC容器负责创建应用程序中的对象,而不再是由对象自身通过new关键字来创建。生命周期管理:Spring IoC容器负责管理对象的生命周期,包括对象的创建、销毁和回收。依赖注入:Spring IoC容器负责将对象之间的依赖关系注入到对象中。底层通过动态代理实现,包括JDK动态代理和CGLIB代理。方法的是JDK代理,没有实现的是CGLIB代理。

2024-03-31 20:07:50 169

原创 延迟双删策略

再次删除是因为刚开始删除redis,缓存中没有数据,这时读取缓存中的数据发现没有就去数据库中读取,但是现在数据库还没有修改完成,导致读取到的还是错误的消息,并且缓存到了redis中,当我们修改完成数据库后,再次清空redis也就是旧数据,当访问缓存的时候发现缓存被清空再次去数据库查询然后缓存到redis这时数据库和缓存都是最新的数据。先将redis中的缓存删除。再次删除redis中的缓存。

2024-03-31 20:06:52 106

原创 Spirng框架中的一些设计模式?

在Spring配置文件中定义的bean默认是单例模式的,即在整个应用程序的生命周期中只存在一个实例。JdbcTemplate它封装了执行SQL查询和更新的基本流程,而具体的SQL语句由使用者提供。Spring的AOP功能主要使用了JDK的动态代理和CGLIB字节码生成技术来实现代理模式。Spring的事件驱动模型(发布-订阅模式)就是观察者模式的一个经典应用。通过事件监听器和事件发布者的机制,实现了对象之间的解耦通信。通过代理模式,可以在不修改原始类代码的情况下增加额外的功能。这种模式允许Spring。

2024-03-29 16:25:13 251

原创 @Autowired和@Resource的区别是什么?

Autowired默认的注入方式是按照类型(byType)进行注入的,也就是说,它会根据Bean的类型来自动装配依赖关系。@Resource默认的注入方式是按照名称(byName)进行注入的,它会先尝试根据Bean的名称来装配依赖关系,如果找不到匹配的Bean,再尝试按照类型(byType)进行注入。,如果不存在会抛出异常。@Autowired可以和@Qualifier注解一起使用,通过指定Bean的名称来实现更精确的注入。@Resource注解的依赖对象如果不存在,默认会尝试注入一个null值。

2024-03-29 16:24:39 172

原创 MQ的好处有哪些?

使用消息队列可以将不同模块或服务之间的耦合度降低。发送者只需要将消息发送到队列中,而不需要关心具体的接收者是谁,接收者也可以从队列中获取消息进行处理,而不需要知道消息的来源。通过消息队列,发送者和接收者之间的通信可以变为异步方式,发送者将消息放入队列后即可继续处理其他任务,而不需要等待接收者的响应。当发送者产生大量请求时,消息队列可以作为缓冲区暂时存储这些请求,然后由接收者按照自己的处理能力逐个处理。

2024-03-29 16:23:27 214 1

原创 mq怎么做到消息尽可能不丢失?

Producer向 broker发送消息,阻塞当前线程等待 broker 响应结果。Consumer先pull消息到本地,消费完成后,才向Broker返回ack。先存到page cache中根据刷盘策略进行刷盘操作。broker接收到发来的消息同步刷盘,默认异步刷盘。当发送消息发生异常的时候重新发送,默认重试3次。Broker数据持久化磁盘。先消费再确认(手动ack)消费失败后,重新尝试消费。

2024-03-29 16:22:24 186 1

原创 Redis有哪些部署方案?

最 基本的部署方式,只在一台服务器上运行一个Redis实例。适合于小型项目或开发测试环境,数据和处理能力受限于单台服务器资源。一个主节点负责写入操作,并将数据同步给一个或多个从节点,从节点提供读服务或者作为数据备份。当主节点出现故障时,需要到某个从节点并将其提升为主节点。Redis Sentinel是一个高可用性解决方案,它是一个分布式系统,能够监控Redis主从集群的状态,并在检测到主节点下线时进行故障转移,选择新的主节点并将从节点指向新的主节点,无需人工干预。

2024-03-29 16:21:23 392 1

原创 Redis如何做的持久化的?

将Redis执行过的所有写指令记录下来(读操作不记录),追加到AOF日志,Redis会在收到客户端修改指令后,先将该指令文本追加到AOF日志中,也就是先存到磁盘,然后再执行指令,这样即使遇到突发宕机,已经存储到AOF日志的指令进行重放一下就可以恢复到宕机前的状态。由fork子进程写入到临时rdb文件,然后等快照数据写入完成替换旧的rdb文件,用二进制压缩存储。将所有的写指令追加到AOF日志中导致AOF日志文件较大,占用的空间比rdb文件更大。持久化就是把内存的数据写到磁盘中,防止服务宕机导致内存数据丢失。

2024-03-29 16:20:36 110 1

原创 什么是缓存击穿、缓存穿透、缓存雪崩?

问题描述设置的过期时间到了,然后热点key过期了大量的请求同时查询一个key时此时这个key(热点key)正好失效,就会导致上面去解决方案。在并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作,其他的线程拿不到锁就阻塞等着,等到第一个线程将数据写入缓存后,后面的线程进来发现已经有缓存了,就直接走缓存,直接将缓存设置为不过期,然后由定时任务去异步加载数据,更新缓存问题描述。

2024-03-29 16:19:55 801 1

原创 什么是MYSQL的两阶段提交?它在解决什么问题?

刷盘时redo log刷盘成功记录到了磁盘上,而binlog在刷盘时,发生宕机导致binlog并没有刷盘成功,因为redolog已经刷盘成功了数据实现了持久化,但是当从机去访问主机的bin log时,这时binlog中的数据并没有修改,因为宕机导致刷盘失败,所以binlog中的数据是错误的,然后从机同步数据后,将错误的数据同步到磁盘中,这时主机和从机的数据不一致。如果在写入redo log之前宕机,那么redo log和bin log中并没有任何数据。主从数据不一致的问题。

2024-03-28 11:54:16 331

原创 CopyOnWriteArrayList是怎么保证集合的安全性的?

当有线程试图修改CopyOnWriteArrayList(如添加、删除元素等操作)时,不会直接对当前正在被其他线程读取的数据进行操作,因为只对写操作加锁,对读操作不会加锁。在读取过程中,即使有其他线程正在进行写操作,读取线程看到的是一个不会改变的视图(旧的数组副本),所以不会发生数据不一致或冲突。由于写操作会先复制一份新的集合,因此在读取期间不需要加锁,多个读取线程可以同时并发访问集合,而互不影响。修改完成后,将内部持有的数据引用切换到新的已修改过的数组。

2024-03-28 11:50:53 238

原创 ThreadLocal

每个线程在往ThreadLocal里设置值的时候,都是往自己的ThreadLocalMap里存,读也是以ThreadLocal作为key,在自己的map里找对应的key,从而实现了线程隔离。ThreadLocalMap内部维护着Entry数组,每个Entry代表一个完整的对象,key是ThreadLocal本身, value是我们设置的值。,多个线程操作这个变量的时候,实际是操作自己本地内存里面的变量,从而起到线程隔离的作用,避免了线程安全问题。每个线程都有一个属于自己的。ThreadLocal为。

2024-03-28 11:49:10 137

原创 AQS的理解

在释放锁后,如果有新的线程尝试获取锁,有可能会抢占成功(比如在线程B释放锁的瞬间,有个 新的线程 D,尝试获取锁,有很大几率会抢占成功)线程 B 抢占锁的过程中把 state 通过 cas 更新为 1,并且设置当前线程同步器的持有者是线程B。按照队列中的等待顺序,依次取队头的线程(比如上面的例子中,下一个获取锁的线程一定是线程 A)线程 A、B、C 同时抢占锁,此时线程 B 抢占成功,线程 A、C 则失败。抢占锁失败的线程,都会被放入到一个 FIFO 的线程等待队列中(双向链表)

2024-03-28 11:47:05 127

原创 synchronized 和ReentrantLock的区别?

比如:一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁,两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。ReetrantLock是一个可重入的独占锁,主要有两个特性,一个是支持公平锁和非公平锁,一个是可重入。ReentrantLock可以选择是否为公平锁,公平锁将按照线程请求锁的顺序来分配锁资源。synchronized默认是非公平锁,即不保证线程获取锁的顺序与它们请求锁的顺序一致。

2024-03-28 11:41:28 382

原创 产生死锁的必要条件?如何避免线程死锁?

一段时间内某资源只由一个进程占用,如果此时还有其他进程请求该资源,则请求者只能等待,直至占有该资源的进程用完释放。占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。一进程在请求新的资源的同时,保持对已分配资源的占有。指在发生死锁时,必然存在一个资源等待的环形链。一次性申请所有的资源。

2024-03-28 11:39:13 198

原创 为什么新生代会出现两个s区,你有考虑过他这样设计的好处吗?

伊甸园区的对象存活率低,垃圾回收(GC)比较频繁。使用复制算法进行垃圾回收时,可以将伊甸园区存活的对象和From区存活的对象复制到To区域,这样不仅提高了回收效率,还能避免产生内存碎片。- 减少FullGC的频率,如果没有两个幸存区,每次在轻GC下存活的对象都会存放到老年代,导致老年代很快就会被填满,进而就会频繁的进行FullGC。

2024-03-28 11:36:57 90

原创 方法区和永久代、元空间的区别?

jdk1.8之前通过永久代实现方法区。jdk1.8永久代完全被元空间取代。永久代和元空间都是对方法区的实现。元空间与永久代之间最大的区别在于。并不在虚拟机中,而是使用。永久代使用的是堆内存。

2024-03-28 11:34:19 306

原创 垃圾回收算法有哪些 ?

这时from变成空的,to区变成有两个对象,这时from和to名字就交换了,from变to,to变from,因为to一定是空的),把存活的对象放到一端,这样就可以消除内存碎片,内存碎片就是不连续的内存空间,这样不连续的内存空间就被放到一起变成连续的内存空间。每一个对象都会为他创建一个计数器,记录他的次数,通过使用次数来判断是否需要垃圾回收,但是为每一个对象创建计数器是一种资源的消耗。缺点:浪费内存空间(多了一个幸存区,有一半的幸存区一直是空的,也就是to区)from和to是一直在变换的,

2024-03-28 11:33:28 219

原创 HashMap 的扩容因子为什么是 0.75?

如果加载因子过大,那么扩容门槛高,扩容不频繁,虽然占用的空间降低了,但是会导致发生哈希冲突的概率大大提高。如果加载因子过小,那么扩容门槛低,扩容频繁,虽然有效避免了哈希冲突发生,但是会占用更多的空间。0.75 可以在性能和空间占用之间取得一个较好的。

2024-03-28 11:30:56 661

原创 AarryList初始容量?如何进行扩容的?

/首次添加元素时,会初始化数组elementData = new Object[10];当要添加第11个元素的时候,底层的elementData数组已满,则需要扩容。默认扩容为原来长度的1.5倍。并将原有数组中的元素复制到新的数组中。当要添加第11个元素的时候,底层的elementData数组已满,则需要扩容。并将原有数组中的元素复制到新的数组中。底层会初始化数组,Object[] elementData = new Object[]{}(长度为0)

2024-03-28 11:30:20 275

原创 synchronized如何使用? 加在普通方法上和加在静态方法的区别?

同步监视器不论是在通过实现Runnable接口创建的类的实例化对象只有一个情况下,还是在在通过继承Thread类创建的类的实例化对象有多个,使用。在通过继承Thread类创建的类的实例化对象有多个,这时同步监视器(锁)通过类.class获取。在通过实现Runnable接口创建的类的实例化对象只有一个,加在普通方法上,默认同步监视器是。在通过继承Thread类创建的类的实例化对象有多个,加在普通方法上,默认同步监视器是。,这时不能保证线程同步(线程安全),因为有多个实例化对象。

2024-03-28 11:27:05 213

原创 String、StringBuffer、StringBuilder 的区别?

等操作,建议使用StringBuffer或StringBuilder替换String,因为使用String效率低。String是不可变的,StringBuffer、StringBuilder是可变的。stringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是。stringBuilder并没有对方法进行加同步锁,所以是。StringBuilder是可变的,线程不安全,StringBuffer是可变的,线程安全,操作少量的数据:适用 string。String是不可变的,所以是。

2024-03-28 11:24:30 229

原创 为什么 ConcurrentHashMap 比 HashTable效率要高?

采用了锁分段技术来保证线程安全。它将哈希表分成若干个segment,每一把锁只锁容器其中一部分数据,这样允许多个线程同时对不同的部分进行操作,从而显著提高了并发性能。,这种全局锁的使用大大降低了其并发性能,因为任何线程想要访问HashTable都需要等待当前持有锁的线程释放锁。,这意味着所有对HashTable的操作(包括读取和写入)都会被锁定,导致在。ConcurrentHashMap在JDK1.7中采用。实现线程安全,在JDK1.8中则采用了。的组合来进一步提高效率。

2024-03-28 11:23:30 196

原创 HashMap的初始化,put流程,get流程,扩容流程,红黑树?

在jdk7中是将新的(key,value)指向旧的元素(头插法),而在jdk8中是旧的元素指向新的 (key,value)元素(尾插法)。情况2,情况3:(key1,value1)元素与现有的(key2,value2)构成单向链表结构,(key1,value1)指向(key2,value2),(key1,value1)是头。条件:当元素的个数达到临界值(----> 数组的长度(例子中数组的长是16) * 加载因子(0.75) )时,就考虑扩容(size >= threshold的解释)

2024-03-28 11:21:28 1082

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除