使用哪一个collection是最好的?很明显,没有单一的答案可以适合所有的状态。无论如何,以下还是有一些通用的建议。遵循这些建议,我们就可以缩小collection的选择范围。
- 使用collection class 的时候,通过接口来运用。
如同所有的java程序设计,接口可以隔离开实现的细节。通过使用接口,程序设计师可以轻易地只以修改初始程序代码就将程序重构成使用不同collection的实现。
- 使用没有被同步化过的collection会有小小的性能提升。
这可能会让许多开发者吃惊---要了解lock取得的性能问题,详见第14章。简单地说,取得lock的性能问题只会发生在竞争的时候。然而,没有被同步化过的collection应该不会竞争lock。如果确实有竞争,那么race condition的问题的可能性会比性能要高。
- 对许多有竞争的算法,考虑改用并发的collection。
在J2SE5.0中加入的set、hashmap与list collection 有高度的最佳化。如果程序的算法适用其中一种interface,就要考虑J2SE5.0的collection来替换被同步化过的JDK1.2班的collection。并发的collection对多线程的访问有更好的最优化。
- 对生产者/消费者模式的程序,考虑使用queue来作为collection。
queue最适合生产者/消费者模式是有许多原因的。首先,queue提供对请求的排序,可以防止数据饥饿。第二,queue被高度地最佳化过,有最少的同步、atomic的访问以及在许多情况下甚至可以安全的并行访问。使用这些collection,大量的线程也可以并行地运作 而只有在对queue的访问上有小小的瓶颈。
- 如果可能的话,尽量减少明确同步的使用。iterator与其他需要遍历过整个collection的支持性method可能会比collection提供更多的同步。当有许多线程涉入的时候这可能会是个问题。
- 限制对copy-on-write这类collection使用iterator。
首先,只在collection的元素数量很少的时候使用这些class,这是由于copy-on-write操作所需要的时间与空间。其次,你的程序不需要collection有最新的信息,iterator只带有创建时间点上的collection的信息而已。
- 考虑使用多个collection。
虽然某些collection有最小的同步,但在有多个线程涉入的时候这些同步过程还是有问题。考虑使用
多个分段的collecton的算法来代替多个线程使用同一个collection的一般实现方式。
- set与map间有少许的差异。
理论上,set与map有好几个方面的差异,但以实现的观点来说,只有一点点的不同。许多set collection就是用map collection实现出来的。这意味着选择实际上并不是选择:存储在set中的元素几乎就是在map中存储的key。
java中如何选择Collection Class--java线程(第3版)
时间: 2024-11-08 21:09:51
java中如何选择Collection Class--java线程(第3版)的相关文章
Java中如何优雅正确的终止线程
Java中终止线程的方式主要有三种: 1.使用stop()方法,已被弃用.原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的"残疾"数据,不符合完整性,所以被废弃.So, forget it! 2.使用volatile标志位 看一个简单的例子: 首先,实现一个Runnable接口,在其中定义volatile标志位,在run()方法中使用标志位控制程序运行 public class MyRunnable i
Java 中的守护(Daemon)线程中finally代码块是否执行的问题
http://www.cnblogs.com/luochengor/archive/2011/08/11/2134818.html 这篇文章应该是Thinking in Java 中文版中的一段,关于线程-守护线程(Daemon Thread)的介绍 可能是我理解de不好,我对书对于daemon thread 中的finally是否执行的介绍有点迷糊了,故自己写个方法测试之后才搞明白. 就拿书中的例子做进一步说明.先来看下原文:不看我的罗嗦,可以直接看文章结尾的结论. import java.u
关于Java中的程序,进程和线程的详解...
程序:一段静态的代码,一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体,是应用软件执行的蓝本. 进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消.反映了一个程序在 一定的数据 集上运行的全部动态过程.通过进程控制块(PCB)唯一的标识某个进程.同时进程占据着相应的资源(例如包 括cpu的使用 ,轮转时间以及一些其它设备的权限)
Java 中的泛型详解-Java编程思想
Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的对象的类型 class Holder1 { private Circle a; public Holder1(Circle a) { this.a = a; } Circle get() { return a; } } 上面的类的可重用性不怎么样,无法持有其他类型的任何对象,下面通过持有Object
Java中toArray的用法探究(java数组与list转换)
一. Incident import Java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); String[] tt
Java中String转换Double类型 Java小数点后留两位
Java中String转换Double类型 double num1 = 0.0; String qq = "19.987"; num1 = Double.valueOf(qq.toString()); 太祖元年 Java小数点后留两位 double num1 =11; double num1 =21; String num1 =""; DecimalFormat df = new DecimalFormat(".00");num3 = df.fo
JAVA中反射机制六(java.lang.reflect包)
一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段,方法和构造函数对其底层对等进行操作. 二.java.lang.reflect AccessibleObject类 java.lang.reflect.AccessibleObject类是Field,Method和Constructor类对象的基类. 它提供了将反射对象标记为在使用它时抑制默认Java
深入理解Java中的Garbage Collection
前提 最近由于系统业务量比较大,从生产的GC日志(结合Pinpoint)来看,需要对部分系统进行GC调优.但是鉴于以往不是专门做这一块,但是一直都有零散的积累,这里做一个相对全面的总结.本文只针对HotSpot VM也就是Oracle Hotspot VM或者OpenJDK Hotspot VM,版本为Java8,其他VM不一定适用. 什么是GC(Garbage Collection) Garbage Collection可以翻译为"垃圾收集" -- 一般主观上会认为做法是:找到垃圾,
Java中的闪光点:ThreadLocal是线程Thead的局部变量,可替代同步机制的设计,值得学习和研究
线程局部变量ThreadLocal,是Java支持的一种线程安全机制,目的是解决多线程的并发问题. 具体来讲,就是多个线程访问该实例对象的变量时,该实例对象将其存储为键值对的形式,保证各个线程(键)分别对应一份该变量值(值),从而保证多线程变量值得安全访问. ThreadLocal与同步机制比较 同步机制:用锁机制保证同一时间只有一个线程访问变量(用时间换空间),变量是多线程共享的,设计时要缜密分析什么时候读写?什么时候锁定?什么时候释放? ThreadLocal:提供每个线程一个独立的变量副本