java并发编程实战-基础构建模块2

来源:互联网 发布:iphone7下载不了淘宝 编辑:程序博客网 时间:2024/05/21 16:23
1,通过并发容器来替代同步容器,可以极大地提高伸缩性并降低风险
2,ConcurrentHashMap
  2.1,用来替代同步的Map,同Map一样也是基于散列的Map。
  2.2,但是它使用一种更加细粒度的加锁机制(分段锁LockStriping)来实现大程度的共享。
  2.3,它允许多个线程同时对容器进行读写操作,在并发访问环境下实现更高的吞吐量,在单线程中也只损失非常小的性能,
  2.4,它在迭代时不会抛出ConcurrentModificationException,不需要在迭代过程中对容器加锁,它的迭代器具有弱一致性,并非“及时失败”。,22.5,并发容器的size和isEmpty只是一个近视值,无法再并发环境下提供一个精确值,但是这些值在并发环境下用处也很小,通过弱化这些操作,以换取其他操作新能的提升,包括get,put,containsKey和remove等
  2.6,于HashTable和synchronizedMap相比,ConcurrentHashMap有着更多的优势以及更少的劣势,因此在大多情况下使用ConcurrentHashMap来代替同步Map能进一步提高代码的可伸缩性
  2.7,只有在应用程序需要以加锁Map以进行独占访问时,才应该放弃使用ConcurrentHashMap
  2.8,ConcurrentHashMap中没有实现对Map加锁以提供独占访问,因此也无法使用客户端加锁机制来创建新的原子操作。
3,CopyOnWriteArrayList
  3.1,它用于替代同步List,在迭代期间不需要对容器进行加锁或复制,类似的使用CopyOnWriteArraySet替代同步Set
  3.2,它迭代器不会抛出ConcurrentModificationException,并且返回的元素与迭代器创建时的元素完全一致,而不必考虑之后修改操作所带来的影响
  3.3,每当修改容器时都会复制底层数组,这需要一定的开销。仅当迭代操作远远多于修改操作是才能使“写入时复制”容器
4,阻塞队列BlockingQueue
  4.1,阻塞队列提供了可阻塞的put和take方法,以及支持定时的offer和poll方法
  4.2,在构建高可用的应用程序时,有界队列是一种强大的资源管理工具,他们能抑制并防止产生过多的工作项,使应用程序在负荷过载的情况下变得更加健壮
  4.3,阻塞队列包括:LinkedBlockingQueue,ArrayBlockingQueue,PriorityBlockingQueue。还有一个SynchronousQueue,它维护的是一组线程,而不是数据,它会一直阻塞直到有另一个线程已经准备好参与到交付过程中。
  4.4,仅当有足够多的消费者,并且总有一个消费者准备好获取交付的工作时,才适合使用同步队列
5,双端队列Deque
  5.1,正如阻塞队列适用于生产者消费者模式,双端队列同样适用于另一种模式,即工作密取(WorkStealing)
  5.2,工作密取指的是每个消费者都有各自的双端队列,如果一个消费者完成了自己双端队列中的全部工作,那么它可以秘密地从其他消费者队列末尾获取工作。工作密取可以极大的减少竞争,比传统的生产者消费者模式具有更高的可伸缩性