日期:2014-05-18  浏览次数:20704 次

java servlet 如何处理并发请求
有个quereyServlet接口,内含select 和 insert 操作都是针对同一个表 tableA。
比如,request1 和request2 ,有可能request1的请求业务逻辑还未完成,request2的请求
就已经来了,两个请求数据上有前后之分。

大家有什么比较好的解决方案吗。
------解决方案--------------------
单利变量,成员变量,静态成员变量都有可能成为共享变量,用的时候注意了就行,servlet本身不是线程安全的。如果确实要在程序处理过程中使用到这些变量,又有临界区数据被修改,可以适当使用同步,队列,CAS等非同步线程安全的处理方法。事物能保证一致性和回滚,但是是否能保证线程安全应该还有待思考吧,也希望rui888解析下事物在保持线程安全方面做了哪些工作
------解决方案--------------------
顺带复制点概念:
事务是恢复和并发控制的基本单位。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
------解决方案--------------------
这个是资源共享的问题,网上搜一下很多,参考代码如下

private static Object lock = new Object();

public void insert() {
synchronized (lock) {
//这里写代码
}
}
public void select() {
synchronized (lock) {
//这里写代码
}
}