Collections 的 synchronized XXX方法

摘要

static <T> Collection<T>

  synchronizedCollection(Collection<T> c)

返回指定 collection 支持的同步(线程安全的)collection。

static <T> List<T>

  synchronizedList(List<T> list)

返回指定列表支持的同步(线程安全的)列表。

static <K,V> Map<K,V>

  synchronizedMap(Map<K,V> m)

返回由指定映射支持的同步(线程安全的)映射。

static <T> Set<T>

  synchronizedSet(Set<T> s)

返回指定 set 支持的同步(线程安全的)set。

static <K,V> SortedMap<K,V>

  synchronizedSortedMap(SortedMap<K,V> m)

返回指定有序映射支持的同步(线程安全的)有序映射。

static <T> SortedSet<T>

  synchronizedSortedSet(SortedSet<T> s)

返回指定有序 set 支持的同步(线程安全的)有序 set。

1 synchronizedCollection

public static <T> Collection<T> synchronizedCollection(Collection<T> c)返回指定 collection 支持的同步(线程安全的)collection。为了保证按顺序访问,必须通过返回的 collection 完成所有对底层实现 collection 的访问。

在返回的 collection 上进行迭代时,用户必须手工在返回的 collection 上进行同步:

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

不遵从此建议将导致无法确定的行为。

返回的 collection 不会 将 hashCode 和 equals 操作传递给底层实现 collection,但这依赖于 Object 的 equals 和 hashCode 方法。在底层实现 collection 是一个 set 或一个列表的情况下,有必要遵守这些操作的协定。

如果指定 collection 是可序列化的,则返回的 collection 也将是可序列化的。

参数:

c - 被“包装”在同步 collection 中的 collection。

返回:

指定 collection 的同步视图。

2 synchronizedList

public static <T> List<T> synchronizedList(List<T> list)返回指定列表支持的同步(线程安全的)列表。为了保证按顺序访问,必须通过返回的列表完成所有对底层实现列表的访问。

在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步:

  List list = Collections.synchronizedList(new ArrayList());
      ...
  synchronized(list) {
      Iterator i = list.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }

不遵从此建议将导致无法确定的行为。

如果指定列表是可序列化的,则返回的列表也将是可序列化的。

参数:

list - 被“包装”在同步列表中的列表。

返回:

指定列表的同步视图。

3 synchronizedMap

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)返回由指定映射支持的同步(线程安全的)映射。为了保证按顺序访问,必须通过返回的映射完成所有对底层实现映射的访问。

在返回映射的任意 collection 视图上进行迭代时,用户必须手工在返回的映射上进行同步:

  Map m = Collections.synchronizedMap(new HashMap());
     ...
  Set s = m.keySet();  // Needn‘t be in synchronized block
     ...
  synchronized(m) {  // Synchronizing on m, not s!
      Iterator i = s.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }

不遵从此建议将导致无法确定的行为。

如果指定映射是可序列化的,则返回的映射也将是可序列化的。

参数:

m - 被“包装”在同步映射中的映射。

返回:

指定映射的同步视图。

4 synchronizedSet

public static <T> Set<T> synchronizedSet(Set<T> s)返回指定 set 支持的同步(线程安全的)set。为了保证按顺序访问,必须通过返回的 set 完成对所有底层实现 set 的访问。

在返回的 set 上进行迭代时,用户必须手工在返回的 set 上进行同步:

  Set s = Collections.synchronizedSet(new HashSet());
      ...
  synchronized(s) {
      Iterator i = s.iterator(); // Must be in the synchronized block
      while (i.hasNext())
          foo(i.next());
  }

不遵从此建议将导致无法确定的行为。

如果指定 set 是可序列化的,则返回的 set 也将是可序列化的。

参数:

s - 被“包装”在同步 set 中的 set。

返回:

指定 set 的同步视图。

5 synchronizedSortedMap

public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)返回指定有序映射支持的同步(线程安全的)有序映射。为了保证按顺序访问,必须通过返回的有序映射(或其视图)完成对所有底层有序映射的访问。

当在返回的有序映射的 collection 视图或者其任何 subMap、headMap 或 tailMap 视图进行迭代时,用户必须手工在该映射上进行同步:

 SortedMap m = Collections.synchronizedSortedMap(new TreeMap());
      ...
  Set s = m.keySet();  // Needn‘t be in synchronized block
      ...
  synchronized(m) {  // Synchronizing on m, not s!
      Iterator i = s.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }

或者:

  SortedMap m = Collections.synchronizedSortedMap(new TreeMap());
  SortedMap m2 = m.subMap(foo, bar);
      ...
  Set s2 = m2.keySet();  // Needn‘t be in synchronized block
      ...
  synchronized(m) {  // Synchronizing on m, not m2 or s2!
      Iterator i = s.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }

不遵从此建议将导致无法确定的行为。

如果指定的有序映射是可序列化的,则返回的有序映射也将是可序列化的。

参数:

m - 被“包装”在同步有序映射中的有序映射。

返回:

指定有序映射的同步视图。

6 synchronizedSortedSet

public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)返回指定有序 set 支持的同步(线程安全的)有序 set。为了保证按顺序访问,必须通过返回的有序 set(或其视图)完成对所有底层实现有序 set 的访问。

在返回的有序 set 上或者其任意 subSet、headSet 或 tailSet 视图上进行迭代时,用户必须手工在返回的有序 set 上进行同步。

  SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
      ...
  synchronized(s) {
      Iterator i = s.iterator(); // Must be in the synchronized block
      while (i.hasNext())
         foo(i.next());
  }

或者:

SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
  SortedSet s2 = s.headSet(foo);
      ...
  synchronized(s) {  // Note: s, not s2!!!
      Iterator i = s2.iterator(); // Must be in the synchronized block
      while (i.hasNext())
          foo(i.next());
  }

不遵从此建议将导致无法确定的行为。

如果指定的有序 set 是可序列化的,则返回的有序 set 也将是可序列化的。

参数:

s - 被“包装”在同步有序 set 中的有序 set。

返回:

指定有序 set 的同步视图。

时间: 2024-12-24 11:54:52

Collections 的 synchronized XXX方法的相关文章

synchronized锁方法块

http://www.cnblogs.com/xrq730/p/4851530.html synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用synchronized同步语句块来解决问题.看一下例子: public class ThreadDomain18 { public void doLongTimeTask() throws Exception

JAVA 同步之 synchronized 修饰方法

在JAVA多线程编程中,将需要并发执行的代码放在Thread类的run方法里面,然后创建多个Thread类的对象,调用start()方法,线程启动执行. 当某段代码需要互斥时,可以用 synchronized 关键字修饰,这里讨论 synchronized 关键字修饰方法时,是如何互斥的. synchronized 修饰方法时锁定的是调用该方法的对象.它并不能使调用该方法的多个对象在执行顺序上互斥. 下面举个具体的例子说明: Test.java 通过 implements Runnable 成为

Collections里面的binarySearch方法

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.ios培训..Net培训</a>.期待与您交流!------ Collections里面的binarySearch方法查阅API发现其返回值类型为:如果搜索键包含在列表中,则返回搜索键的索引:否则返回 (-(插入点) - 1).插入点 被定义为将键插入列表的那一点:即第一个大于此键的元素索引:如果列表中

Java多线程5:synchronized锁方法块

synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用synchronized同步语句块来解决问题.看一下例子: 这个实验可以得出以下两个结论: 1.当A线程访问对象的synchronized代码块的时候,B线程依然可以访问对象方法中其余非synchronized块的部分,第一部分的执行结果证明了这一点 2.当A线程进入对象的synchronized代

synchronized修饰方法和对象的区别

使用synchronized(object) { 代码块.... } 能对代码块进行加锁,不允许其他线程访问,其的作用原理是:在object内有一个变量,当有线程进入时,判断是否为0,如果为0,表示可进入执行该段代码,同时将该变量设置为1,这时其他线程就不能进入:当执行完这段代码时,再将变量设置为0. 想保证代码块在任务情况下都同步,即代码块在程序的中同一时刻只被一个线程调用,即需要使用synchronized( static object). object必须是静态变量,否则不同对象调用该方法

xml资源getStringArray(R.array.xxx)方法

在res/values/下新建menu_names.xml 代码如下: <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="menu_names"> <item>xx1</item> <item>xx2</item> <item>xx3</item>

java中synchronized使用方法

synchronized的一个简单样例 public class TextThread { /**  * @param args  */ public static void main(String[] args)  {  // TODO 自己主动生成方法存根        TxtThread tt = new TxtThread();        new Thread(tt).start();        new Thread(tt).start();        new Thread(

Comparable、Iterator接口和Collections类的实现方法

Comparable接口: 此接口强行对实现它的每个类的对象进行整体排序.这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法. 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序. 方法:int compareTo(T o) 比较此对象与指定对象的顺序.如果该对象小于.等于或大于指定对象,则分别返回负整数.零或正整数. Collections类: List的常用算法: ArrayList默认长度(siz

synchronized(this) 和synchronized(xxx.class)的区别和联系

synchronized(ThreadTest.class)是对ThreadTest这个类进行加锁,类里面的属性,方法都是同步的,是针对于特定的类的~~ synchronized(this){}是对{}这里面的内容进行加锁的,仅仅是针对于当前对象的