java api之实现(下)[Java编程]
本文“java api之实现(下)[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
包装器实现
包装器实现是一种将它们的实际工作拜托给一个特定对象集的实现,它在该 对象集 所供应的功效之上又增添了额外的功效.对design patterns(计划款式)爱好者来说,这是一个 decorator(油漆工)款式.固然有点异国情调,但确切简单明了.
这些实现是匿名的:不是供应一个大众类,JDK 供应一个 static factory method(静态办法).全部这些都可以在仅包含静态办法的Collections API 中找到.
同步包装器(Synchronization Wrappers)
同步包装器将自动同步(线程安全的)增添到一个肆意的 对象集.6个 核心 对象集 接口中的每一个都对应一个静态办法:
public static Collection synchronizedCollection(Collection c);
public static Set synchronizedSet(Set s);
public static List synchronizedList(List list);
public static Map synchronizedMap(Map m);
public static SortedSet synchronizedSortedSet(SortedSet s);
public static SortedMap synchronizedSortedMap(SortedMap m);
每一个这样的办法都返回一个由特定 对象集 作为后备的同步(线程安全的)Collection.为保证串行存取,全部对后备 对象集 的存取都必须通过返回的 对象集 来完成,这一点是至关重要的.保证这一点的一个简便办法是不要保持对后备 对象集 的引用, 成立这样的同步 对象集 是一个小本领:
List list = Collections.synchronizedList(new ArrayList());
一个用这种方法成立的对象集,每一比特都是线程安全的,就象VectorM那样的"正常"同步 对象集 一样.在需求并发存取情形下,在返回的 对象集 上迭代时,用户对返回的 对象集 做手工同步是非常必要的.这是因为迭代是通过对对象集 的多重调用完成的,它必须被编写为一个单独的最小单元操作(atomic operation).在一个包装器同步的 对象集 上的迭代惯用程序以下所示:
Collection c = Collections.synchronizedCollection(myCollection);
synchronized(c) {
Iterator i = c.iterator(); // Must be in the synchronized block!
while (i.hasNext())
foo(i.next());
}
在一个同步 Map 的 Collection视图上的迭代惯用程序与上述程序类似,但有一个诀窍,那就是,当在同步 Map 的Collection视图上迭代时, 用户必须对同步 Map 做手工同步,而不是对 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());
}
包装器实现的一个小的缺陷是你不能履行一个包装器实现的非接口操作.因此,比方在上面的 List 的例子中,你就不能调用包装的ArrayList上的ensureCapacity 操作.
以上是“java api之实现(下)[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:java api之算法
- ·下一篇文章:java api之实现(上)
- ·中查找“java api之实现(下)”更多相关内容
- ·中查找“java api之实现(下)”更多相关内容