在这里有很多同学忽略了我们到底要synchronize什么,事实上,在实践运用中,像Vector/HashTable这样的底层的synchronization并没有太大意义,楼上用了Collections的synchronizedList函数,意义和底层synchronization是一样的,但是,实践中往往有如下的要求: if (!listData.contains(objData)) listData.put(objData); someone might argue that we can use Set here instead of List. 我知道,我只是举一个例子,像这种情况,懂线程的人都知道在判断之后,另一个线程可能会加入同一instance的objData,这样这个判断就不是很完全了。 做法是, synchronized (listData) { if (!listData.contains(objData)) listData.put(objData); } 事实上,很高的楼上的yanghx2000(info)已经提过了,但是号召他的人应该是没有,但是它的做法却是最正确的,这也是sun为什么放弃Vector/HashTable的原因,第一,没有太大的意义;第二,每次都要request/release lock,运行太慢。
修改ArrayList的方法如果多线程要调用,就在该方法定义上加synchronized关键字,此为同步
访问时
synchronized(list){
.........
}
还是:Collections.synchronizedList(List list)
97.如何选择List
供选择的有 数组,ArrayList, LinkedList
A.数组在顺序访问和随机访问速度比任何容器都要快
B.ArrayList的随机访问要比LinkedList要快。
C.理论上ArrayList的顺序访问要比LinkedList要快,但实际上并非如此。
D.LinkedList的插入删除,特别是删除,比ArrayList要快的多的多。
E.Vector的速度比不上ArrayList,它只是用来解决版本问题,所以不要使用它。小结List的最佳用法:
A.如果元素的数量固定时,选用数组
B.如果元素的数量不固定时,首先选用ArrayList;如果其中的插入删除操作很多引发性能问题时,考虑使用LinkedList。96.如何选用Set
根据需要可以在TreeSet, HashSet , LinkedHashSet中选用一个。
A.HashSet的各项性能均比TreeSet要好,但TreeSet的好处是可以按插入顺序保存元素。
B.LinkedHashSet与HashSet的比较:
a.LinkedHashSet的插入比HashSet要慢,因为它有维护链表的代价。
b.LinkedHashSet的遍历比HashSet要快。95.如何挑选Map
根据需要可以在TreeMap, HashMap , LinkedHashMap , IdentityHashMap ,WeakHashMap,HashTable中选用一个。A.HashMap只比HashTable快一点,但HashMap是用来替代HashTable的。
B. 选择Map的时候首先选用HashMap ,只有在用恒定有序的Map时,才使用HashMap .
(TreeMap比HashMap要慢,但它是用来创建有序列表的,所以使用它时用不着为它排序,就能直接进行查询了。)
C.LinkedHashMap比HashMap稍慢,它要维护链表。
D.IdentityHashMap,无法与上述Map作比较,因为它用==而不是equals来比较对象的相等性。
import java.util.ArrayList;
import java.util.Collections;List aArrayList = Collections.synchronizedList(new ArrayList());
这样创建的ArrayList实例是synchronized的
还是用Vector吧
if (!listData.contains(objData))
listData.put(objData);
someone might argue that we can use Set here instead of List. 我知道,我只是举一个例子,像这种情况,懂线程的人都知道在判断之后,另一个线程可能会加入同一instance的objData,这样这个判断就不是很完全了。
做法是,
synchronized (listData)
{
if (!listData.contains(objData))
listData.put(objData);
}
事实上,很高的楼上的yanghx2000(info)已经提过了,但是号召他的人应该是没有,但是它的做法却是最正确的,这也是sun为什么放弃Vector/HashTable的原因,第一,没有太大的意义;第二,每次都要request/release lock,运行太慢。
但是Vector也是可以的,看你的应用对性能的要求吧!
Collections.synchronizedList(List list)应该是最佳选择
SynchronizedList中的那一堆synchronized(mutex)是白锁的啊。
不用Vector最重要的原因俺认为是为了保证代码更高的兼容性。