java 的synchronized有关问题

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),免得入侵了业务对象。