赞
踩
1.背景
用多线程接收推送的订单数据,把接收的订单数据存到一个表中,实现的需求是:如果接收的订单消息在数据库中已经存在,那么执行update操作;
如果没有存在,那么执行insert操作代码逻辑:
if(oderid != null){//该记录已存在
update();
}else{//写入记录
insert();
}
线程启动后,发现:数据库表中有两条oderid相同的记录
通过查看日志发现:
两个线程相差时间极端,各自收到了同一个订单的推送消息,在执行数据库insert或update时,都判断出该订单在数据库表中不存在,所以都执行insert操作,造成数据库表中有两条orderid相同的记录
2.解决方案
synchronized同步代码块即加同步锁,synchronized同步代码块的功能:
1)、当A线程访问对象的synchronized代码块的时候,B线程依然可以访问对象方法中其余非synchronized块的部分
2)、当A线程进入对象的synchronized代码块的时候,B线程如果要访问这段synchronized块,那么访问将会被阻塞
if(oderid != null){//该记录已存在
update();
}else{synchronized(this){if(oderid != null){//该记录已存在
update();
}else{
insert();
}
}
<Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。