高级并发对象
到目前为止,本课程重点关注从一开始就是Java平台一部分的低级别API,这些API适用于非常基础的任务,但更高级的任务需要更高级别的构建块,对于充分利用当今多处理器和多核系统的大规模并发应用程序尤其如此。
在本节中,我们将介绍Java平台5.0版中引入的一些高级并发功能,大多数这些功能都在新的java.util.concurrent
包中实现,Java集合框架中还有新的并发数据结构。
- Lock对象支持简化许多并发应用程序的锁定语法。
-
执行器定义用于启动和管理线程的高级API,
java.util.concurrent
提供的执行器实现提供适用于大规模应用程序的线程池管理。 - 并发集合使管理大量数据更容易,并且可以大大减少同步需求。
- 原子变量具有最小化同步并有助于避免内存一致性错误的功能。
- ThreadLocalRandom(在JDK 7中)提供从多个线程有效生成伪随机数。
并发集合
java.util.concurrent
包中包括对Java集合框架的大量添加,这些最容易按照提供的集合接口进行分类:
- BlockingQueue定义了先进先出的数据结构,当你尝试向满的队列添加或从空队列中检索时,该数据结构会阻塞或超时。
-
ConcurrentMap是java.util.Map的子接口,它定义了有用的原子操作,仅当键存在时,这些操作才会移除或替换键值对,或仅在键不存在时才添加键值对,使这些操作原子化有助于避免同步,
ConcurrentMap
的标准泛型实现是ConcurrentHashMap,它是HashMap的并发模拟。 -
ConcurrentNavigableMap是
ConcurrentMap
的子接口,支持近似匹配,ConcurrentNavigableMap
的标准泛型实现是ConcurrentSkipListMap,它是TreeMap的并发模拟。
所有这些集合通过定义将对象添加到集合的操作与访问或移除该对象的后续操作之间的先发生关系来帮助避免内存一致性错误。
并发随机数
在JDK 7中,java.util.concurrent包含一个方便的类ThreadLocalRandom,用于期望使用来自多个线程或ForkJoinTasks
的随机数的应用程序。
对于并发访问,使用ThreadLocalRandom
而不是Math.random()
可以减少竞争,并最终提高性能。
你需要做的就是调用ThreadLocalRandom.current()
,然后调用其中一个方法来检索随机数,这是一个例子:
int r = ThreadLocalRandom.current().nextInt(4, 77);
进一步阅读
- Java Concurrent Animated:展示并发功能用法的动画。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。