前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java.util.concurrent 在shorturl项目中的应用

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

作者头像
架构师刀哥
发布2018-03-20 17:22:47
8670
发布2018-03-20 17:22:47
举报
文章被收录于专栏:坚毅的PHP坚毅的PHP

问题:微博短链项目应用到哪些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) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。 场景:用于对每个线程创建dao对象,做更新操作。 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-05-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档