java并发实践------构建块(building blocks)

    本章节主要包含两点:

        同步容器;

        并发容器;

   同步容器指的是什么?

        指的是采用容器内置锁(instrinsic lock)修饰方法,当多个线程调用同步容器的方法时,只能串行。JAVA中常见的同步容器包含:Vector,HashTable,以及用Collections.synchronizedCollection处理后的容器。

   并发容器指的是什么?

        并发容器顾名思义就是允许多个线程同时访问容器,且是线程安全的。JAVA中常见的线程安全容器有:ConcurrentMap,BlockingQuene,CopyOnWriteArrayList等容器。基本上位于java.util.concurrent包下。

    

    为何要引入并发容器?

         回答这个问题之前,需要了解一下同步容器的缺陷;

         同步容器的缺陷主要体现在两个方面:1、在遍历同步容器时,如果有其他线程对同步容器进行操作,会导致迭代器抛出异常;2、在多线程环境下,分别操作同步容器的多个方法,会产生诡异的异常。比如下面的代码所示:

public static Object getLast(Vector list) {
    int lastIndex = list.size() - 1;
    return list.get(lastIndex);
}
public static void deleteLast(Vector list) {
    int lastIndex = list.size() - 1;
    list.remove(lastIndex);
}

         在否一个时间点Vector的size是10,有两个线程同时分别调用getLast和deleteLast方法,deleteLast方法先执行的话,会导致getLast方法抛出数组越界异常。

         解决1和2的困境的方法是添加Vector的instrinsic lock。但是这会牺牲可伸缩性,耗费很大的性能。当遍历一个大的Vector时,所有的线程只能一个个的执行方法,这会带来灾难性的后果。

         采用并发容器可以避免上述的缺陷,大大提升性能。迭代并发容器,当容器发生修改时,迭代器不会抛出异常。当读取远远大于修改时,可以采用CopyOnWriteArrayList容器保证迭代的都是最新的修改的内容。同时大大提升并发能力。


     并发容器应用的几个例子:

     1、阻塞队列和生产者-消费者模式

            BlockingQueue提供了可阻塞的put和task方法,当固定容器已经满了的时候,调用put方法,会阻塞调用者,从而起到限制生产速率的作用;当容器为空时,调用task方法,会阻塞消费者。BlockingQueue解耦生产者和消费者之间的依赖,生产者不需要关注谁是消费者,反之消费者也不用关注谁是生产者。

     2、Synchronizer

           Synchronize是一个对象,根据本身的状态调节线程的控制流。

           2.1、CountdownLatch

           2.2、CyclicBarrier

后续:用并发容器构建高速缓存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值