关于java中并发时引起的问题(多线程问题)

场景如下:

我有一个订单导入页面,如下图:



公司里面有很多员工,都需要进入这个页面,进行订单导入。

并发进行,可能存在这样的问题,两个同事,同时输了一个相同的订单号,同时点击订单导入,同时导入成功。

那么数据库中就会存在两条一模一样的订单数据。

上面的问题是多线程引发的最常见的问题了。

解决思路如下:

1:首先每次订单导入的时候,调用订单查询方法,先查询一次数据库中是否存在同样的订单。

2:如果存在了,提示用户,订单已经存在。

3:如果不存在,不提示用户,直接调用导入的方法。

同步锁应该加在哪里呢?

假如订单查询是一个方法:

public Boolean isOrderExist(String orderID);

导入订单是另外一个方法:

public Boolean importOrder(String orderID);

1):调用过程:

ajax-----》isOrderExist---->存在,提示用户------》用户继续导入--------》ajax-----》importOrder

ajax-----》isOrderExist------>不存在-------》ajax--------importOrder

这种调用过程是我们最常使用的调用过程,但是很难解决多线程的并发的问题。

2):调优后的调用过程

public Boolean isOrderExist(String orderID){

if(orderID=EXIST){

return true;

}else{

importOrder(orderID);

}

}

public Boolean importOrder(String orderID);

订单如果存在:过程不变

ajax-----》isOrderExist---->存在,提示用户------》用户继续导入--------》ajax-----》importOrder

订单如果不存在:

ajax-----》isOrderExist

通过第2)中方式,将同步锁加载isOrderExist方法上面,保证每个订单的查询和导入的代码块,每次只有一个线程进入,保证了多个线程不会因为并发的原因,同时发现订单不存在,同时导入了两个一模一样的订单。

public synchronized Boolean isOrderExist(String orderID);

搞定,关于多线程,还有很有有意思的案例,都需要我们细细的体会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值