概述
由于项目中应用到实时数据的接收,但是后端并不能直接将接收到的数据进行入库,需要进行一定的格式化及处理后才能入库。当单线程情况下接收到一定时间后,后端处理的数据为之前时间接收到的数据,则通过线程池来实现多个线程添加数据。
线程同步(synchronized)
线程同步问题在此项目中提现于,当前数据被其他线程获取并未添加进数据库时,此时又被其他线程获取到,则会出现同一条数据被添加进两次数据库的现象。
数据片段
可以看到第一条数据和第二条数据完全相同,但是被添加了两次;这就可能导致如果当前数据为故障数据,那么系统就会为同一条数据发出两次故障预警信息。
解决方案
在java存入数据模块代码中,添加同步代码块synchronized();通过使用同步代码块对存库操作的语句进行加锁,从而实现实时数据在数据库中的唯一性。
数据片段
可以看到添加同步代码块后的实时数据没有了重复数据。
线程同步(Lock)
Lock锁方法也可同样实现线程的同步问题,实现方法为:在实现存库代码模块中对存入对象进行加锁,这样便可以实现数据在库中的唯一性。注:Lock锁需要手动加锁并解锁,故为防止死锁,则unlock()方法需放在finally代码块中。
数据片段
可以看到数据库中数据并没有相同数据存在。
由于项目中代码为保密内容,故在此只做文字记录叙述,此博客也为自己解决多线程问题留下解决思路,如有错误欢迎大家指出。