- 博客(7)
- 收藏
- 关注
原创 八股之Redis
当查询缓存未命中时,一个线程获取互斥锁,再查询数据库重建缓存数据,写入缓存并释放锁,其他缓存尝试获取互斥锁,失败后重新查询缓存,一直重复获取锁、查询缓存操作,直到能查询到缓存中的数据。再redis中,不设置过期时间,而是设置一个过期时间的字段,当数据被查询且已过期时,设置一个互斥锁并开一个新的线程进行数据库重建,原线程无需等待重建,直接返回过期数据。会统计每个key的访问频率,值越小淘汰优先级越高。设置key过期后,我们不去管它,当需要该key时,我们再检查其是否过期,如果过期就删掉,没有就返回该key。
2024-11-13 16:44:11
970
原创 RabbitMQ学习笔记
默认情况下,RabbitMQ的会将消息依次轮询投递给绑定在队列上的每一个消费者。1. 消息存储:当生产者发送消息时,RabbitMQ 可以将消息存储在队列中,直到消费者从队列中取出并处理。生产者可以将消息标记为持久化,RabbitMQ 会将这些消息保存到磁盘上,以防止在服务器宕机时消息丢失。3. 消息确认:RabbitMQ 可以在消费者成功处理完消息后收到确认(ACK),确保消息被成功消费。因此,RabbitMQ 不仅仅是简单的消息传递工具,它还具备存储消息的能力,确保消息在生产者和消费者之间的可靠传递。
2024-09-21 19:29:12
734
原创 并发编程学习笔记4
当多个线程访问同一个共享资源时,如果没有适当的同步机制(如 `synchronized`、`Lock` 等),线程间的操作可能会相互干扰,导致数据不一致或竞争条件(race condition)。对象逃逸是指一个对象在未经过适当封装的情况下,被多个线程访问到,导致线程安全问题。简单来说,就是一个对象被外部线程引用和修改,可能导致不一致的状态。例如,类的一个内部状态被暴露给外部类或线程,或者对象在构造过程中还未完全初始化时就被其他线程访问到,这都可能造成线程不安全。线程安全性主要取决于。
2024-09-05 16:37:32
190
原创 并发编程学习笔记3
Java API 层面的 RUNNABLE 状态涵盖了 操作系统 层面的 【可运行状态】、【运行状态】 和【阻塞状态】(由于 BIO 导致的线程阻塞,在 Java 里无法区分,仍然认为 是可运行)作用:它采用互斥的方式让同一 时刻至多只有一个线程能持有【对象锁】,其它线程再想获取这个【对象锁】时就会阻塞住。这样就能保证拥有锁 的线程可以安全的执行临界区内的代码,不用担心线程上下文切换。CPU会将时间片分给可运行状态的线程,使其变成运行状态。TERMINATED 当线程代码运行结束。
2024-09-04 17:39:14
274
原创 并发编程学习笔记2
使用interrupt方法设置该线程的打断状态,当该线程读取到打断状态为true或者抛出InterruptedException异常(sleep状态被打断)时,再执行具体打断操作,也就是说,该线程不会真正停止,具体怎么停止由该线程说了算。有一种特殊的线程叫做守护线程,只要其它非守 护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。例如:t1线程睡眠1000ms,t2线程睡眠2000ms,总耗时为2002ms。例如,t1是sleep的线程,t2是正常的线程。
2024-09-03 17:49:39
711
原创 并发编程学习笔记1
2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException。调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程。使用 start 是启动新的线程,通过新的线程间接执行 run 中的代码。因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码。直接调用run会在当前同一线程执行,没有启用新的线程。3. 睡眠结束后的线程未必会立刻得到执行。
2024-09-03 00:53:41
512
原创 Vue的reactivity系统在处理响应式数据更新和异步操作的bug
使用监听器,当facultyId发生变化时,将paogramId里的值清0,当取消选中facultyId时,@deSelect执行search方法(根据条件分页查询),但是查询时programId仍为原来的值。PS:本人主修后端,前端菜鸡,有不对的地方还请各位大佬指正。今天再写vue3+ts项目时,遇到了一个bug。
2024-08-13 15:37:53
170
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人