并发编程
文章平均质量分 88
孟德爱吃香菜
这个世界能轻而易举毫不费劲做到的,只有贫穷和衰老,其他的都需要努力。
展开
-
redisson中的分布式锁
它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。大家都知道,如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。的参数来指定加锁的时间。原创 2023-11-09 11:48:08 · 269 阅读 · 0 评论 -
基于redis实现分布式锁
Redis 也保证脚本会以原子性(atomic)的方式执行: 当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。index1业务逻辑执行完成,开始调用del释放锁,这时释放的是index3的锁,导致index3的业务只执行1s就被别人释放。问题:setnx刚刚获取到锁,当前服务器宕机,导致del释放锁无法执行,进而导致锁无法锁无法释放(死锁)redis采用单线程架构,可以保证单个命令的原子性,但是无法保证一组命令在高并发场景下的原子性。index1业务逻辑没执行完,3秒后锁被自动释放。原创 2023-11-08 09:26:12 · 1213 阅读 · 0 评论 -
Springboot AMQP RabbitMQ 的安装使用
交换机的作用是什么?接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息,路由失败,消息丢失FanoutExchange的会将消息路由到每个绑定的队列声明队列、交换机、绑定关系的Bean是什么?QueueBinding描述下Direct交换机与Fanout交换机的差异?Fanout交换机将消息路由给每一个与之绑定的队列Direct交换机根据RoutingKey判断路由给哪个队列如果多个队列具有相同的RoutingKey,则与Fanout功能类似。原创 2023-08-07 10:37:19 · 1609 阅读 · 0 评论 -
sonar 错误 提示 Synchronize on a new “Object“ instead.使用Id 作为锁
这是有风险的,因为语句中使用的锁对象synchronized在所有要同步的线程中应该是恒定的。可以看到她让我们给一个 常量对象 ,但是明显不是我想要的,我想要的是每个不同ID 进入是异步的,只有同一个Id才是锁定的。要使用 ID 作为锁,在 Java 中,你可以创建一个自定义的类来存储 ID,并将其作为监视器进行同步。映射的键,你可以将特定的锁与每个 ID 关联起来,确保每个 ID 的同步而不是跨所有 ID 进行同步。映射中不存在对应的锁对象,就会创建一个新的,并存储在映射中。将返回之前创建的锁对象。原创 2023-08-08 15:14:04 · 599 阅读 · 0 评论 -
Thread.currentThread().interrupt() 用法详解
如果不使用方法来设置线程的中断状态为 “中断”,则线程的中断状态将保持不变。在这种情况下,线程可能会继续执行而不响应中断请求,导致无法正确停止或退出循环,或者无法在阻塞状态下及时响应中断请求。因此,应根据需要在适当的时候检查线程的中断状态,并进行相应的处理。原创 2023-08-08 11:41:13 · 4126 阅读 · 0 评论 -
什么是ConcurrentHashMap?
采用了分段锁的机制来实现高度的并发性。通过将数据分散到不同的段中,不同段的操作可以并发进行,从而减少了竞争和锁冲突。它使用一种变体的取模算法,通过位运算使得不同的键能够均匀地分布到不同的段中,减少了锁竞争。是线程安全的哈希表实现,适用于需要在多线程环境下进行安全的键值存储和访问的场景。它保证了对数据的操作是原子的、有序的,避免了数据不一致的问题。使用分段锁机制,不同线程可以同时获取不同段的锁,允许并发访问不同的段。对于线程安全的并发访问,读操作可以同时进行,而写操作需要获取对应段的锁,以保证数据的正确性。原创 2023-08-07 14:26:04 · 429 阅读 · 0 评论 -
Java线程池的用法(并发编程)
Java 线程池是一种管理和复用线程的机制,可以提高程序的效率和性能。它通过预先创建一组线程,并使用这些线程来执行任务,而不是为每个任务都创建一个新的线程。原创 2023-08-03 11:38:20 · 133 阅读 · 0 评论 -
乐观锁和悲观锁(结合实例)
乐观锁适用于读多写少、冲突发生较少的情况,避免了不必要的加锁开销。但是在冲突频繁的情况下可能需要多次重试。悲观锁适用于写多读少、冲突发生较多的情况,可以通过加锁保证数据一致性。但是过多的加锁会导致线程阻塞和性能降低。选择使用乐观锁还是悲观锁取决于实际的业务场景和需求,并且在实现时需要考虑并发性能和数据一致性的权衡。原创 2023-08-01 09:41:19 · 233 阅读 · 0 评论