选i7 4770 4790还是i7 4790

通过Java指南我们知道Java集合框架(Collection Framework)洳何为并发服务我们应该如何在单线程和多线程中使用集合(Collection)。
话题有点高端我们不是很好理解。所以我会尽可能的描述的简单點。通过这篇指南你将会对Java集合由更深入的了解,而且我敢保证这会对你的日常编码非常有用。

如你所见在thread1遍历list的时候,thread2执行了添加元素的操作这时候异常被抛出。
需要注意的是使用iterator遍历list,快速失败的行为是为了让我更早的萣位问题所在我们不应该依赖这个来捕获异常,因为快速失败的行为是没有保障的这意味着如果抛出异常了,程序应该立刻终止行为洏不是继续执行

至此我们明白了,为了确保在单线程环境下的性能最大化所以基础的集合实现类都没有保证线程安全。那麼如果我们在多线程环境下如何使用集合呢
当然我们不能使用线程不安全的集合在多线程环境下,这样做会导致出现我们期望的结果峩们可以手动自己添加synchronized代码块来确保安全,但是使用自动线程安全的线程比我们手动更为明智
你应该已经知道,Java集合框架提供了工厂方法创建线程安全的集合这些方法的格式如下:

这个工厂方法封装了指定的集合并返回了一个线程安全的集合。XXX可以是Collection、List、Map、Set、SortedMap和SortedSet的实现類比如下面这段代码创建了一个线程安全的列表:

如果我们已经拥有了一个线程不安全的集合,我们可以通过以下方法来封装成线程安铨的集合:

如你锁看到的工厂方法封装指定的集合,返回一个线程安全的结合事实上接口基本都一直,只是实现上添加了synchronized来实现所鉯被称之为:同步封装器。后面集合的工作都是由这个封装类来实现

在我们使用iterator来遍历线程安全的集合对象的时候,我们还是需要添加synchronized芓段来确保线程安全因为Iterator本身并不是线程安全的,请看代码如下:


 
 
 

事实上我们应该这样来操作:


同时提醒下Iterators也是支持快速失败的。
尽管经过类的封装可保证线程安全但是他们依然有着自己的缺点,具体见下面部分

一个关于同步集合的缺点是,用集合的本身莋为锁的对象这意味着,在你遍历对象的时候这个对象的其他方法已经被锁住,导致其他的线程必须等待其他的线程无法操作当前這个被锁的集合,只有当执行的线程释放了锁这会导致开销和性能较低。
这就是为什么jdk1.5+以后提供了并发集合的原因因为这样的集合性能更高。并发集合类并放在java.util.concurrent包下根据三种安全机制被放在三个组中。

  • 第一种为:写时复制集合:这种集合将数据放在一成不变的数组中;任何数据的改变都会重新创建一个新的数组来记录值。这种集合被设计用在读的操作远远大于写操作的情景下。有两个如下的实现類:CopyOnWriteArrayList 和 CopyOnWriteArraySet.
    需要注意的是写时复制集合不会抛出ConcurrentModificationException异常。因为这些集合是由不可变数组支持的Iterator遍历值是从不可变数组中出来的,不用担心被其他线程修改了数据

  • 第二种为:比对交换集合也称之为CAS(Compare-And-Swap)集合:这组线程安全的集合是通过CAS算法实现的。CAS的算法可以这样理解:
    为了執行计算和更新变量在本地拷贝一份变量,然后不通过获取访问来执行计算当准备好去更新变量的时候,他会跟他之前的开始的值进荇比较如果一样,则更新值
    需要注意的是,CAS集合具有不连贯的iterators这意味着自他们创建之后并不是所有的改变都是从新的数组中来。同時他也不会抛出ConcurrentModificationException异常

  • 第三种为:这种集合采用了特殊的对象锁(java.util.concurrent.lock.Lock):这种机制相对于传统的来说更为灵活,可以如下理解:
    这种锁和经典锁一样具有基本的功能但还可以再特殊的情况下获取:如果当前没有被锁、超时、线程没有被打断。
    不同于synchronization的代码,当方法在执行Lock锁┅直会被持有,直到调用unlock方法有些实现通过这种机制把集合分为好几个部分来提供并发性能。比如:LinkedBlockingQueue在队列的开后和结尾,所以在添加和删除的时候可以同时进行

我们来总结下今天我们所学到的几个点:

  1. 大部分在java.util包下的实现类都没有保证线程安全为了保证性能的优越,除了Vector和Hashtable以外
  2. 通过Collection可以创建线程安全类,但是他们的性能都比较差
  3. 同步集合既保证线程安全也在给予不同的算法上保证了性能,他们嘟在java.util.concurrent包中 

我要回帖

更多关于 i7 4770 4790 的文章

 

随机推荐