如何同步共享同一个list

例如多个线程要从同一个list 中取对象,别的线程取了,其他线程则不可以再去这个对象.

1.同步多线程 对 LinkList 的removeFirst()的操作或者 其他List 的remove 再get第一个对象 的方法来实现.

class SendSmsTask implements Runnable{

        private LinkedList<TMessage> smsList;
        private Port port;

         public SendSmsTask( LinkedList<TMessage> smsList,Port port) {
             this.smsList=smsList;
             this.port=port;
        }
        
        @Override
        public void run() {

            while(true){
                TMessage sms=null;
                synchronized (smsList) {   //对取对象同步
                    if(!smsList.isEmpty()) 
                    sms=smsList.removeFirst();
                    else
                        break;
        
                 port.send(sms);
                }
    
    

        }

}    

 

2.对list 分段,每个线程处理其中一段...

第一个线程 处理 list index 为 0-2500的对象

第二个线程 处理 list index 为 2500-5000的对象

 

3.注意: 

CopyOnWriteArrayList

这个是同步的list,但是不能达到想要的目的.因为这里同步实现的方法是通过在多线程中复制原来的数组来实现的.在不同的线程中的迭代器是独立的.还有就是迭代的时候是不能对这个list 进行增加,删除的.

posted @ 2015-10-26 10:28  predisw  阅读(587)  评论(0编辑  收藏  举报