java.util.concurrent 在shorturl项目中的应用

问题:微博短链项目应用到哪些concurrent包中的类,类的用途是什么?场景是怎样?效果?

  1. java.util.concurrent.atomic.AtomicInteger ( AtomicLong)
    用途:可以用原子方式更新的 int 值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范。AtomicInteger 可用在应用程序中(如以原子方式增加的计数器),并且不能用于替换 Integer。但是,此类确实扩展了 Number,允许那些处理基于数字类的工具和实用工具进行统一访问。 (jdk文档)
    场景:ThreadPoolExecutor的成员变量,记录等待线程数,确保不超出最大线程数
    效果:正常,保证不超出
  2. java.util.concurrent.ThreadPoolExecutor
    用途:一个 ExecutorService,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors工厂方法配置。

    线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法。每个 ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数。  (jdk文档)
    场景:启动高中低优先级的Executor,设置不同的最大线程数,最大等待数执行不同级别任务;如异步修复短链ext信息,异步读取mcq数据入库入缓存
    效果:正常,应对每日数千万级写入请求;但三种executor的设置让人困惑,maxPriorityExecutor的大小和minPriorityExecutor一样,normalPriorityExecutor却是最大的线程和等待数?

  3. java.util.concurrent.LinkedBlockingQueue
    用途:一个基于已链接节点的、范围任意的 blocking queue。此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。  (jdk文档)
    场景:ThreadPoolExecutor的构造成员变量
    效果:不明,是否如jdk doc写的性能较差待研究。用ConcurrentLinkedQueue 是否更好? 有空测试之(http://blog.csdn.net/arkblue/article/details/6151488 两者的性能比较;http://yanxuxin.iteye.com/blog/586943 多线程基础总结10,11)
  4. java.util.concurrent.locks.ReentrantLock
    用途:一个可重入的互斥锁 Lock,它具有与使用 synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。

    ReentrantLock 将由最近成功获得锁,并且还没有释放该锁的线程所拥有。当锁没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁并返回。如果当前线程已经拥有该锁,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。  synchronized缺点 a.只有一个"条件"与锁相关联,这对于大量并发线程的情况是很难管理(等待和唤醒);b.多线程竞争一个锁时,其余未得到锁的线程只能不停的尝试获得锁,而不能中断

    场景:创建memcache client建立连接时加锁,避免多次创建socket

  5.  java.util.concurrent.ConcurrentHashMap

     

  6. java.lang.ThreadLocal
    用途:该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 getset 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
    场景:用于对每个线程创建dao对象,做更新操作。 

你可能感兴趣的:(Concurrent)