Collections.synchronizedList实现ArrayList线程安全原理

  • Post author:
  • Post category:其他


Collections 工具包中实现容器线程安全的方法如下,可使非线程安全的 List、Map、Set 集合满足线程安全

在这里插入图片描述

以Collections.synchronizedList() 为例:

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

    • RandomAccess 空接口,标记接口,用于说明实现该接口的List具备快速随机访问功能
    • SynchronizedRandomAccessList
    • SynchronizedList

      看下UML类图,

      SynchronizedRandomAccessList 继承 SynchronizedList ,

      SynchronizedList 继承 SynchronizedCollection

      在这里插入图片描述

      关于List的操作add(),get(),remove() 在SynchronizedList、SynchronizedCollection中 都加上了同步对象(mutex)锁,从而实现了线程安全

      在这里插入图片描述

      Collections.synchronizedList(List list) 返回的是一个 SynchronizedList 的对象,SynchronizedList 的实现里,get, set, add 等操作都加了 mutex 对象锁,再将操作委托给最初传入的 list。这个对象以组合的方式将对 List 的接口方法操作,委托给传入的 list 对象,并且对所有的接口方法对象加锁,得到并发安全性。

      这就是以组合的方式,将非线程安全的对象,封装成线程安全对象,而实际的操作都是在原非线程安全对象上进行,只是在操作前给加了同步锁。



版权声明:本文为weixin_35959462原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。