`

【Java源码解读】Collections.synchronizedXxx

    博客分类:
  • Java
 
阅读更多

源码来源:OpenJDK 10

 

解读对象

  • synchronizedCollection(Collection<T> c)
  • synchronizedList(List<T> list)
  • synchronizedSet(Set<T> s)
  • synchronizedSortedSet(SortedSet<T> s)
  • synchronizedNavigableSet(NavigableSet<T> s)
  • synchronizedMap(Map<K, V> m)
  • synchronizedSortedMap(SortedMap<K,V> m)
  • synchronizedNavigableMap(NavigableMap<K,V> m)

 

Collections.synchronizedCollection(Collection<E> c)

该方法可以将一个Collection包装为同步(线程安全)的List。但是通过Iterator、Spliterator或Stream遍历这个新List时,需要在外部做好同步

 

Collection c = Collections.synchronizedCollection(myCollection);
synchronized (c) {
    Iterator i = c.iterator(); // Must be in the synchronized block
    while (i.hasNext())
        foo(i.next());
}

 

 

SynchronizedCollection

构造方法

SynchronizedCollection(Collection<E> c)

创建一个SynchronizedCollection,并将指定的集合c作为内部集合

此方法会将SynchronizedCollection实例本身作为互斥体(mutex)

 

SynchronizedCollection(Collection<E> c, Object mutex)

创建一个SynchronizedCollection,并将指定的集合作为内部集合,将指定的对象作为互斥体(mutex)

 

其它方法

SynchronizedCollection的以下方法都是对互斥体进行同步,再调用内部list实例上的相应方法:

size()

isEmpty()

contains(Object o)

toArray()

toArray(T[] a)

add(E e)

remove(Object o)

containsAll(Collection<?> coll)

addAll(Collection<? extends E> coll)

removeAll(Collection<?> coll)

retainAll(Collection<?> coll)

clear()

toString()

forEach(Consumer<? super E> consumer)

removeIf(Predicate<? super E> filter)

 

因为对ListIterator的线程安全式使用需要在外部额外的同步,所以以下3个方法没有同步的必要:

spliterator()

stream()

parallelStream()

 

Collections.synchronizedList(List<T> list)

  • 该方法可以将一个List包装为同步(线程安全)的List。但是通过Iterator、Spliterator或Stream遍历这个新List时,需要在外部做好同步(参照Collections.synchronizedCollection(Collection<E> c))。
  • 因为同步实现方式相同,所以包装后的List性能与Vector相当。
  • 如果原List是RandomAccess,该方法会用Collections.SynchronizedRandomAccessList类包装;
    • 否则就是用Collections.SynchronizedList类包装
      • RandomAccess是一个空接口,不包含任何方法。它主要用于标记List接口的实现类支持快速随机获取(通常指时间复杂度为O(1))。ArrayList就是RandomAccess,而LinkedList不是

 

SynchronizedList

此类继承自SynchronizedCollection,并实现List接口

 

构造方法

SynchronizedList(List<E> list)

创建一个SynchronizedList,并将指定的list作为内部列表

此方法会将SynchronizedList实例本身作为同步互斥体(mutex)

Collections.synchronizedList方法内部调用的就是此方法

 

SynchronizedList(List<E> list, Object mutex)

创建一个SynchronizedList,并将指定的list作为内部列表,将指定的对象作为同步互斥体(mutex)

 

其它方法

SynchronizedList的以下方法都是对互斥体进行同步,再调用内部list实例上的相应方法:

equals(Object o)

hashCode()

get(int index)

set(int index, E element)

add(int index, E element)

remove(int index)

indexOf(Object o)

lastIndexOf(Object o)

addAll(int index, Collection<? extends E> c)

replaceAll(UnaryOperator<E> operator)

sort(Comparator<? super E> c)

 

因为对ListIterator的线程安全式使用需要在外部额外的同步,所以以下2个方法没有同步的必要:

listIterator()

listIterator(int index)

 

subList(int fromIndex, int toIndex)

该方法也对互斥体进行了同步,并将内部list的subList方法返回的实例封装为SynchronizedList,且指定互斥体为原SynchronizedList的互斥体

(subList这类方法使用场景少,实现复杂,真的有些吃力不讨好)

 

SynchronizedRandomAccessList

此类继承自SynchronizedList,并实现RandomAccess接口

与SynchronizedList不同之处:subList的返回值是被包装成SynchronizedRandomAccessList

 

构造方法

SynchronizedRandomAccessList(List<E> list)

创建一个SynchronizedRandomAccessList;内部就是调用SynchronizedList(List<E> list)

Collections.synchronizedList方法内部调用的就是此方法

 

SynchronizedRandomAccessList(List<E> list, Object mutex)

创建一个SynchronizedRandomAccessList;内部就是调用SynchronizedList(List<E> list, Object mutex)

0
0
分享到:
评论

相关推荐

    java List 排序 Collections.sort

    在Java编程中,`List`接口是集合框架的重要组成部分,提供了有序的元素存储。...通过阅读和理解`Collections.sort()`的源码,开发者可以进一步提升自己的技能,同时也能更好地理解和运用其他Java集合框架的方法。

    金陵科技学院软件院大二上Java高级1215Collections.docx

    代码中两次使用了`Collections.frequency(list, "abc")`和`Collections.frequency(list, "123")`分别计算"abc"和"123"在列表中出现的次数。 通过这些例子,我们可以看到`Collections`类如何方便地对Java集合进行...

    commons-collections.jar

    commons-collections-20040616.jar, ...commons-collections.jar, commons-collections3-3.2.1.jar, commons-collections4-4.1-javadoc.jar, commons-collections4-4.1-src.zip, commons-collections4-4.1.jar

    Java Collections.pdf

    例如,Collections.sort()方法可以对List进行排序,而Collections.synchronizedXXX()方法则可以帮助我们创建线程安全的集合。 在实际开发中,选择合适的集合类型和方法至关重要。例如,当我们需要保持元素插入顺序...

    java中Collections.sort排序详解

    Java中Collections.sort排序详解 Java中的Collections.sort排序是Java.util.Collections类中的一个静态方法,用于对列表进行排序。下面将详细介绍Collections.sort排序的使用和实现机制。 Collections.sort()方法...

    iesi.collections.dll

    《iesi.collections.dll:C# .Net集合全版本解析》 iesi.collections.dll是一个与C#编程语言和.Net框架紧密相关的动态链接库文件,它包含了用于处理集合操作的一系列类和方法。在.NET环境中,集合是存储和管理对象...

    Java Generics and Collections.chm

    例如,`Collections.sort()` 可用于对列表进行排序,`Map.merge()` 可以原子性地更新键值对。 通过深入学习《Java Generics and Collections》,开发者不仅可以掌握如何编写类型安全的代码,还能有效地组织和操作...

    Java Collections.sort()实现List排序的默认方法和自定义方法

    Java Collections.sort()实现List排序的默认方法和自定义方法 Java Collections.sort()是Java语言中用于对List进行排序的方法,通过使用这个方法可以对List进行默认排序,也可以根据需要实现自定义的排序规则。 ...

    java中Collections.sort排序函数用法详解

    在Java编程语言中,`Collections.sort()` 是一个非常重要的函数,它用于对集合中的元素进行排序。这个函数是 `java.util.Collections` 类的一个静态方法,适用于列表(List)类型的集合。`Collections.sort()` 可以...

    Collections 随机排序方法Shuffle源码说明

    在Java编程语言中,`Collections.shuffle()`方法是一个非常实用的工具,它用于对集合中的元素进行随机排序。这个方法在处理各种数据集时,比如游戏中打乱卡片顺序、抽奖程序或者任何需要随机化顺序的场景,都发挥着...

    JAVA对list集合进行排序Collections.sort()

    在Java编程语言中,`Collections.sort()` 方法是一个非常重要的工具,用于对List接口实现的集合进行排序。这个方法使得开发者能够方便地按照指定的顺序排列集合中的元素。本篇文章将详细探讨如何使用 `Collections....

Global site tag (gtag.js) - Google Analytics