关于java中并发时引起的问题(多线程问题)
来源:互联网 发布:淘宝模特照片处理修腿 编辑:程序博客网 时间:2024/06/17 00:06
场景如下:
我有一个订单导入页面,如下图:
公司里面有很多员工,都需要进入这个页面,进行订单导入。
并发进行,可能存在这样的问题,两个同事,同时输了一个相同的订单号,同时点击订单导入,同时导入成功。
那么数据库中就会存在两条一模一样的订单数据。
上面的问题是多线程引发的最常见的问题了。
解决思路如下:
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);
搞定,关于多线程,还有很有有意思的案例,都需要我们细细的体会。
- 关于java中并发时引起的问题(多线程问题)
- java全局变量引起的并发问题
- java 关于System.out.println的多线程并发问题
- 数据库并发引起的问题
- 多线程中并发问题
- 关于android解决多线程并发的问题
- 关于不支持多线程处理的并发问题
- java多线程并发问题
- Servlet中出现的由多线程引起的问题
- Servlet中出现的由多线程引起的问题
- java多线程_并发问题的解析
- 解决Java多线程并发的计数器问题
- HashMap1.8中多线程扩容引起的死循环问题
- Java中ThreadLocal类(解决多线程程序中并发问题的一种新思路,主要为参数的拷贝问题)
- java nio多线程引起的full gc问题
- 线程的并发所引起的问题
- service全局变量引起的并发问题
- Mysql 并发引起的死锁问题
- Shell脚本调试技术
- oracle 如何在group by 的语句中使用rownum,实现分页
- Github(一)
- 自定义View系列教程05--示例分析
- A C Programming Language Puzzle
- 关于java中并发时引起的问题(多线程问题)
- java 实现Excel批量导入数据库 及生成excel
- NotePad++,EditPlus,UltraEdit,Windows的记事本,浏览器设置utf-8
- 快速查找Unity死循环
- Design Twitter
- Android-更新系统图库碰到的问题
- 左旋转字符串
- jdk:CopyOnWriteArrayList
- Xamarin.Android set cornerRadius by code