在高并发环境下,再次认识java 锁

简介: 在高并发环境下,再次认识java 锁

1.背景

线上部署的应用,偶尔会出现,数据读取出来为空的情况,但是通过打印日志,发现数据确实是存在的。

日志文件:

对应代码:

2.系统架构梳理

tagId2NameMap 是通过一个定时任务去更新的,即:updateTagIdMapping 函数,

本来 tagId2NameMap 是HashMap

3.问题定位排查

(1)以为是不安全的原因导致的,改为ConcurrentHashMap,改为ConcurrentHashMap,还是会出现一样的问题

(2)增加日志,发现是在发生updateTagIdMapping 更新时间和 getTagName 函数时间非常接近的时候,在几毫秒的差异时候,会出现上述问题。

怀疑是tagId2NameMap 在clear 之后,数据还没有完全addAll进去。

4.解决思路

解决方案一:

通过加锁的方式来进行处理,上述业务场景,非常明显,适合读写锁,读的QPS 是较高的,而写的QPS非常低,是通过定时任务来定时进行配置。

private final ReentrantReadWriteLock updateLock = new ReentrantReadWriteLock();

在更新的地方加写锁

在读取的地方加读锁

最终没有出现上述问题。

解决方案二:

用将数据添加到tmp 临时变量中,再进行赋值替换

问题定位难点:本地较难复现,刚好更新时间和读取时间一致。本地很难出现和线上一样的QPS,线上流量高峰期QPS有接近6000

读写锁原理和使用参考:

相关文章
|
17天前
|
Java
Java中ReentrantLock释放锁代码解析
Java中ReentrantLock释放锁代码解析
25 8
|
1月前
|
Java
Java并发编程中的锁机制
【2月更文挑战第22天】 在Java并发编程中,锁机制是一种重要的同步手段,用于保证多个线程在访问共享资源时的安全性。本文将介绍Java锁机制的基本概念、种类以及使用方法,帮助读者深入理解并发编程中的锁机制。
|
17天前
|
Java 调度
Java中常见锁的分类及概念分析
Java中常见锁的分类及概念分析
16 0
|
4天前
|
Java
Java配置环境
Java配置环境
10 0
Java配置环境
|
9天前
|
安全 Java 调度
Java并发编程:深入理解线程与锁
【4月更文挑战第18天】本文探讨了Java中的线程和锁机制,包括线程的创建(通过Thread类、Runnable接口或Callable/Future)及其生命周期。Java提供多种锁机制,如`synchronized`关键字、ReentrantLock和ReadWriteLock,以确保并发访问共享资源的安全。此外,文章还介绍了高级并发工具,如Semaphore(控制并发线程数)、CountDownLatch(线程间等待)和CyclicBarrier(同步多个线程)。掌握这些知识对于编写高效、正确的并发程序至关重要。
|
10天前
|
Java
浅谈Java的synchronized 锁以及synchronized 的锁升级
浅谈Java的synchronized 锁以及synchronized 的锁升级
8 0
|
11天前
|
缓存 负载均衡 Java
Java高并发性能指标
Java高并发是指在Java编程环境中,系统能够同时处理大量并发请求或操作的能力。这里的“高”强调的是并发处理的数量级较大,需要系统能够有效地管理多个并发的执行单元,如线程或进程,以确保它们能够高效且正确地执行。
11 0
|
12天前
|
存储 缓存 Java
线程同步的艺术:探索 JAVA 主流锁的奥秘
本文介绍了 Java 中的锁机制,包括悲观锁与乐观锁的并发策略。悲观锁假设多线程环境下数据冲突频繁,访问前先加锁,如 `synchronized` 和 `ReentrantLock`。乐观锁则在访问资源前不加锁,通过版本号或 CAS 机制保证数据一致性,适用于冲突少的场景。锁的获取失败时,线程可以选择阻塞(如自旋锁、适应性自旋锁)或不阻塞(如无锁、偏向锁、轻量级锁、重量级锁)。此外,还讨论了公平锁与非公平锁,以及可重入锁与非可重入锁的特性。最后,提到了共享锁(读锁)和排他锁(写锁)的概念,适用于不同类型的并发访问需求。
43 2
|
13天前
|
Java 程序员 编译器
Java中的线程同步与锁优化策略
【4月更文挑战第14天】在多线程编程中,线程同步是确保数据一致性和程序正确性的关键。Java提供了多种机制来实现线程同步,其中最常用的是synchronized关键字和Lock接口。本文将深入探讨Java中的线程同步问题,并分析如何通过锁优化策略提高程序性能。我们将首先介绍线程同步的基本概念,然后详细讨论synchronized和Lock的使用及优缺点,最后探讨一些锁优化技巧,如锁粗化、锁消除和读写锁等。
|
14天前
|
Java 编译器
Java并发编程中的锁优化策略
【4月更文挑战第13天】 在Java并发编程中,锁是一种常见的同步机制,用于保证多个线程之间的数据一致性。然而,不当的锁使用可能导致性能下降,甚至死锁。本文将探讨Java并发编程中的锁优化策略,包括锁粗化、锁消除、锁降级等方法,以提高程序的执行效率。
13 4