java 的synchronized问题程序是,从HTML写数据,通过javaservlet接收数据,传给Java的一个对象处理数据。我想
java 的synchronized问题
程序是,从HTML写数据,通过javaservlet接收数据,传给Java的一个对象处理数据。
我想是,java对象处理完一个数据之后,再处理下一个。
但是如果HTML里写数据过快,则java对象再未处理完这个数据时,接收到新数据交叉或者混乱的顺序处理新来的数据。
public void run() {
synchronized (this.charthreshold) {
if(index==0){ //Determine the end of this array
index=1;
System.out.println("***************************THREAD START: "+index);
//java对象,处理数据
System.out.println("***************************THREAD END");
index=0;
}
}
}但是,这样子改了之后,通过thread限制。但是问题是,数据并不是按照HTML写的顺序进入java处理对象的。比如HTML写的是1,2,3,4,5,6,7,...。通过thread传递给java对象的却是1,2,4,5,7,3,...
请问原因是什么,该如何处理? Java 线程
[解决办法]
当前对象获取到锁后,处理完数据,锁就要归还,如果当前有多个任务在等待这个锁,下一次谁再获取到锁java内部机制里面并没有保证,所以造成了数据混乱了。
可以采用自定义一个锁来控制。
public void run() {
if (!locked) {
locked = true;
if(!statck.isEmpty()){ //栈里面如果数据不为空则数据从栈里面取.
//这样就可以保持数据保存的顺序是正确的了。
data = statck.getData();
}
if(index==0){ //Determine the end of this array
index=1;
System.out.println("***************************THREAD START: "+index);
//java对象,处理数据
//数据在data 中
System.out.println("***************************THREAD END");
index=0;
}
locked = true;
}else{
statck.saveData(data);//当前有数据正在处理,将数据保存在一个堆栈里面
}
}
//上面只是个大致思路,可以参考下。
[解决办法]
这就是锁对象还是锁方法的问题。
你这应该是接到一个数据就调用一次该对象的该方法。
如果你锁的是对象,那么只能一个人在编辑,这样的话效率低,但是能达到你想要的效果
锁方法的话,就是你这样了。
[解决办法]
没必要显式的加锁,首先servlet接收的请求并不是顺序的,也就是说并发的,因此谁抢到锁谁就先执行。如果你要保证顺序的话,那么第一个你在后台的处理那个业务类与servlet之间加一个线程安全的队列,这和加锁差不多(也不是绝对的顺序),但是实现比较麻烦,因为你如果有返回值的话,还要wait/notify。第二个,绝对的顺序需求一般是由业务要求的,比如按时间先后排,那么你就要把这个队列改造成有序队列...也还好了,不是很麻烦.队列的元素加个包装类(提供wait/notify),免得入侵了业务对象。
