java-并发-高级并发对象2
浏览以下内容前,请点击并阅读 声明
并发集合
java.util.concurrent包包含了许多对于java集合框架的补充,根据提供的接口可以将这些集合分为以下几类:
- BlockingQueue 定义了先进先出(first in first out)的数据结构,如果对一个满的队列添加元素或者从一个空的队列中检索元素,则会造成超时,或者被阻塞。
- ConcurrentMap 是java.util.Map的子接口,定义了一些原子操作。这些原子操作可以移除或者替换掉一个存在的键值对,或者增加一个键不存在的键值对。原子操作可以避免使用同步。通用的ConcurrentMap的实现是ConcurrentHashMap,其为HashMap的并发版本。
- ConcurrentNavigableMap 是ConcurrentMap的子接口,支持近似匹配,标准的通用实现为ConcurrentSkipListMap,是TreeMap的并发版本。
所有的这些集合可以通过在添加对象到集合的动作和后续的访问和移除动作间建立发生前关系,帮助避免内存一致性错误。
原子变量
java.util.concurrent.atomic包定义了支持对于一个变量进行原子操作的类,其中所有的类都含有读和写的set和get方法,如同读写volatile变量一样,也就是说,对于同一个变量对应的set方法和接下来的get方法具有发生前关系。原子方法compareAndSet
也具有这些内存一致性特征,就像对于整型原子变量使用的原子算数方法一样。原子变量使用方法如下例:
import java.util.concurrent.atomic.AtomicInteger; class AtomicCounter { //定义原子字段 private AtomicInteger c = new AtomicInteger(0); public void increment() { c.incrementAndGet(); } public void decrement() { c.decrementAndGet(); } //返回基本类型 public int value() { return c.get(); } }
并发随机数字
JDK7中,java.util.concurrent包含一个方便的类,ThreadLocalRandom,因为有些程序希望在多个线程或者ForkJoinTask中使用随机数字,对于并发的访问,使用ThreadLocalRandom相对于Math.random()可以减少资源争夺,最终获得更优的性能。
使用ThreadLocalRandom,只需要调用其静态方法current方法即可获得一个ThreadLocalRandom对象,然后再调用其中的一个方法获得一个随机数:
//nextInt方法可以指定两个整数以作上限和下限,以下返回4到77的随机整数 int r = ThreadLocalRandom.current().nextInt(4, 77);