java并发编程实战-基础构建模块2
2017-07-06 22:31
197 查看
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,工作密取指的是每个消费者都有各自的双端队列,如果一个消费者完成了自己双端队列中的全部工作,那么它可以秘密地从其他消费者队列末尾获取工作。工作密取可以极大的减少竞争,比传统的生产者消费者模式具有更高的可伸缩性
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,工作密取指的是每个消费者都有各自的双端队列,如果一个消费者完成了自己双端队列中的全部工作,那么它可以秘密地从其他消费者队列末尾获取工作。工作密取可以极大的减少竞争,比传统的生产者消费者模式具有更高的可伸缩性
相关文章推荐
- 《Java并发编程实战》读书笔记-第5章 基础构建模块
- Java并发编程实战笔记(4)-基础构建模块
- 《java并发编程实战》基础构建模块(六)
- java并发编程实战-基础构建模块1
- 《java并发编程实战》基础构建模块(四)
- 《java并发编程实战》基础构建模块(三)
- Java并发编程实战(学习笔记四 第五章 基础构建模块 上)
- 《Java并发编程实战》 阅读笔记 5. 基础构建模块
- 《java并发编程实战》基础构建模块(五)
- Java并发编程实战 - 第5章 基础构建模块
- Java并发编程实战(二)基础构建模块
- 《java并发编程实战》基础构建模块(二)
- 《java并发编程实战》基础构建模块(一)
- 《java并发编程实战》基础构建模块(七)
- java并发编程实战:基础构建模块笔记
- java并发编程实战-基础构建模块3
- 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式
- java并发编程实战学习(3)--基础构建模块
- Java并发编程基础构建模块(01)——同步容器类
- Java并发编程基础构建模块(04)——线程阻塞与中断