Collections.synchronizedList 工厂方法

 Collections.synchronizedList 工厂方法

通常的Map,Set,List实现都不是线程安全的,通过这些工厂方法可以得到相应的同步容器,相当于增强了访问控制,把一个链表对象传递过来后,我们都通过返回的这个链表对象来进行各种操作(都是同步方法),而不再操纵底层的那个链表。此外,在Vector和同步封装器类中是用内置锁来来支持客户端加锁,所以我们可以进行扩展。
在对对链表迭代的过程中也要注意加锁,否则在迭代的过程中,如果其他某个线程改变了容器的属性,next,hasNext方法就会抛出ConcurrentModificationException 异常(而诸如ConcurrentHashMap的并发容器不需要迭代过程加锁)。更重要的是,要防止隐藏迭代,如果对某个容器调用toString方法的时候。下面是对应的代码。


1.迭代的时候要同步。
List<Integer> safeList = Collections. synchronizedList(  new  ArrayList<Integer>());
       synchronized  (safeList) {
           Iterator<Integer> i = safeList.iterator();  // Must be in synchronized block
            while  (i.hasNext())
               System.  out .println(i.next());
     }

2.隐藏迭代器。
public   class  HiddenIterator {
     private   final  Set<Integer>  set  =  new  HashSet<Integer>();

     public   synchronized   void  add(Integer i) {
         set .add(i);
    }

     public   synchronized   void  remove(Integer i) {
         set .remove(i);
    }

     public   void  addTenThings() {
        Random r =  new  Random();
         for  (  int  i = 0; i < 10; i++)
            add(r.nextInt());
        System.  out .println(  "DEBUG: added ten elements to "   set );  //这里
    }
}

2.容器中toString方法的实现。
public  String toString() {
        Iterator<E> it = iterator();
         if  (! it.hasNext())
             return   "[]" ;

        StringBuilder sb =  new  StringBuilder();
        sb.append(  '[' );
         for  (;;) {
            E e = it.next();
            sb.append(e ==  this  ?  "(this Collection)"  : e);
             if  (! it.hasNext())
                 return  sb.append(  ']' ).toString();
            sb.append(  ',' ).append(  ' ' );
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值