Collections分析之SynchronizedList

本文介绍如何通过Java的Collections.synchronizedList方法创建线程安全的List,并详细解释为何需要对该List实例加锁以确保多线程环境下的操作一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Collections中有SynchronizedList方法

  1. @ThreadSafe  

  2. class GoodListHelper <E> {  

  3.     public List<E> list = Collections.synchronizedList(new ArrayList<E>());  

  4.   

  5.     public boolean putIfAbsent(E x) {  

  6.         synchronized (list) {  

  7.             boolean absent = !list.contains(x);  

  8.             if (absent)  

  9.                 list.add(x);  

  10.             return absent;  

  11.         }  

  12.     }  

  13. }  



上面是一个对已有的同步的list增加一个线程安全的方法。

但是为什么锁要加list呢?看看源码:

  public static <T> List<T> synchronizedList(List<T> list) {
return (list instanceof RandomAccess ?
                new SynchronizedRandomAccessList<T>(list) :
                new SynchronizedList<T>(list));
    }


由源码可知,list是RandomAccess的子类,所以,产生SynchronizedRandomAccessList:

SynchronizedRandomAccessList继承自SynchronizedList,SynchronizedList继承自SynchronizedCollection,SynchronizedRandomAccessList里方法的同步都是用的mutex,mutex是一个object,在SynchronizedCollection中定义的,在构造函数中使其为本身。

所以上面的代码需要使用list作为同步锁了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值