public class MyUtil
{
   public static List getMyList(List list,int startIndex,int endIndex)
   {
     startIndex=(startIndex<0)?0:startIndex;    
     endIndex=(endIndex>list.size())?list.size():endIndex;
     List returnList=list.subList(startIndex,endIndex);
     return returnList();  
   }    
}如果有多个用户同时调用MyUtil.getMyList(),会不会造成数据的共享冲突呢?就是A用户调用后返回的是B用户产生的结果。
分不多了,希望大家能回答一下,谢谢了。

解决方案 »

  1.   

    有可能发生数据的共享冲突,因为返回的sublist不是只读的。除非你能保证不对返回的sublist进行任何除了读取之外的操作等等。sublist是list的一个view,对它的操作会反应到list上。
      

  2.   

    自己判断。关键是如果存在两个或两个以上线程同时读写同一个对象,注意,是“读”、“写”。就有可能存在冲突,并且必须使用synchronized来避免冲突。你的写的getMyList()方法本身不会造成冲突,但是,后续的程序可能会操作由它返回的sublist。如果这样,就会有冲突。这取决于你的后续程序。但,有一点是肯定的,你这种方法不是线程安全的,是存在隐患的。最好的方法是,返回一个sublist的拷贝。
      

  3.   

    问题很明确,就是看你的数据是给只读的还是可写的。刚才有人说过了,sublist返回的不是你list子集的copy,如果你有一个线程对其中一个sublist改写了,那么就会影响其他的sublist。如果你的数据只读,就不会有无问题,但是如果你还对sublist需要修改,那么建议就返回一个copy。
      

  4.   

    那startIndex,lastIndex这几个参数会有线程冲突的问题吗?
      

  5.   

    startIndex,lastIndex不重要,重要的是list。比如:如果有一个线程得到sublist后,执行sublist.clear();,那么,后面执行的其它线程还能得到你想要的sublist吗?
      

  6.   

    TO  UnAgain:是不是改成这样就没问题?public class MyUtil
    {
       public static List getMyList(List list,int startIndex,int endIndex)
       {
         startIndex=(startIndex<0)?0:startIndex;    
         endIndex=(endIndex>list.size())?list.size():endIndex;
         List returnList=new ArrayList();
         returnList=list.subList(startIndex,endIndex);
         return returnList();  
       }    
    }
      

  7.   

    你先说说,你得到sublist之后,你还有做哪些操作?
      

  8.   

    如果你后面的操作只是取数据,使用sublist.toArray(),返回一个数组比较合适,这样就不存在线程冲突了。
      

  9.   

    OK,谢谢,我已经明白你的意思了。 就是sublist变量是一个引用,指向某个内存块,如果把sublist这个引用返回了,如果再在方法体外把sublist作了修改,就等于改了那个内存块中的内容了。其实如果从这个角度考虑,那个方法再加了synchronized修饰也解决不了你所担心的问题的。关键是方法体外再使用sublist对象时,要先在别的内存块生成一个副本,然后再对那个副本进行操作,就不会影响到原来的那个内存块了。你的意思是这样的吧!~这点其实我是很久前已经知道,我发贴子,是想知道这个问题:startIndex,endIndex这两个值,会不会在returnList=list.subList(startIndex,endIndex);
    被执行之前,已经被后来进入的线程改写了?如果改写了,得到的sublist就不是原来期望的那个大小了。
      

  10.   

    startIndex和endIndex不会被改写,但是可能会得不到期望的结果。比如,你对得到的sublist执行clear(),那么整个list的长度就缩短了,恰好这时你执行下一个subList,就会得到不适当的值。