日期:2014-05-20  浏览次数:20654 次

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;