Java使用线程池存入实时数据(锁)

本文探讨了在Java项目中如何处理实时数据接收的线程同步问题,以避免数据重复入库。通过使用synchronized关键字和Lock锁机制,确保了数据在数据库中的唯一性,防止了同一条数据被多次添加导致的故障预警重复。文中详细描述了同步代码块的使用以及Lock锁的加锁和解锁操作,并提供了实际代码片段作为示例。
摘要由CSDN通过智能技术生成

概述

由于项目中应用到实时数据的接收,但是后端并不能直接将接收到的数据进行入库,需要进行一定的格式化及处理后才能入库。当单线程情况下接收到一定时间后,后端处理的数据为之前时间接收到的数据,则通过线程池来实现多个线程添加数据。

线程同步(synchronized)

线程同步问题在此项目中提现于,当前数据被其他线程获取并未添加进数据库时,此时又被其他线程获取到,则会出现同一条数据被添加进两次数据库的现象。

数据片段

在这里插入图片描述

可以看到第一条数据和第二条数据完全相同,但是被添加了两次;这就可能导致如果当前数据为故障数据,那么系统就会为同一条数据发出两次故障预警信息。

解决方案

在java存入数据模块代码中,添加同步代码块synchronized();通过使用同步代码块对存库操作的语句进行加锁,从而实现实时数据在数据库中的唯一性。

数据片段

数据
可以看到添加同步代码块后的实时数据没有了重复数据。

线程同步(Lock)

Lock锁方法也可同样实现线程的同步问题,实现方法为:在实现存库代码模块中对存入对象进行加锁,这样便可以实现数据在库中的唯一性。注:Lock锁需要手动加锁并解锁,故为防止死锁,则unlock()方法需放在finally代码块中。

数据片段

数据
可以看到数据库中数据并没有相同数据存在。

由于项目中代码为保密内容,故在此只做文字记录叙述,此博客也为自己解决多线程问题留下解决思路,如有错误欢迎大家指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值