![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
开放性问题
文章平均质量分 54
记录 JAVA 开发者可能碰到的开放性问题
盼兮猫
长亭外 古道边 芳草碧连天
展开
-
关于使用分布式锁仍无法解决线程安全问题
最近在项目开发时遇到线程安全问题,简单来说就是通过分布式锁防止多实例入库相同数据失败,不同实例还是会入库相同数据背景介绍:实例 A、B 接收完全相同的消息,经过加工后入库。为了防止同一份消息入库两次,A、B 采用分布式锁的方式保证同步,其中每条消息都包含唯一 id 字段,以该字段为 Key 建立分布式锁,假如 A 实例抢占到消息1的锁,执行入库并持有锁100秒不释放,在这100秒内当 B 系统扫描到消息1时,无法抢占锁,不执行入库。每条消息的入库都会封装为任务在线程池中执行,所以抢锁失败后不会二次扫描理原创 2021-05-24 10:20:01 · 338 阅读 · 0 评论 -
高并发系统
高并发带来的系统瓶颈主要在数据库,单个数据库同时最多承受几千的并发,如果上万的请求同时打过来,就很可能造成宕机。设计高并发系统主要从以下几个方面考虑:线程池缓存MQES分库分表读写分离系统拆分线程池:请求太多时,为了避免请求直接打到数据库,导致数据库挂掉,可以采用线程池做中间桥梁,这样虽然降低处理效率,但可以保证系统稳定运行缓存:大多数请求都是读数据,并且很多时候都是读同一块数据,可以将这部分数据放在缓存中,提高查询效率,如网站的热点标签数据使用 redis 保存MQ:消息队列和线原创 2021-05-06 13:13:57 · 307 阅读 · 1 评论 -
Java 内存泄漏
内存泄露是指应该被回收的内存没有被 GC 回收,轻则只会影响程序所占内存大小,严重可能导致 OutOfMemrory 异常。这类异常通常很难排查,大多数时候需要借助外部插件扫描内存判断。常见的导致内存泄露的场景:静态集合:如 hashMap,hashSet 等。静态集合类的声明周期和程序相同,集合中保存的所有对象元素永远不会被回收。除非手动将元素删除或是将静态集合置为 null各种连接:数据库连接,I/O 连接等。编写代码时一定要注意关闭连接,这样 GC 才能回收到这部分内存变量不合理的原创 2021-04-12 15:48:17 · 89 阅读 · 0 评论