疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java并发-高级并发对象


 

   

  并发集合

  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方法即可:

  int r = ThreadLocalRandom.current() .nextInt(4, 77);