专栏首页坚毅的PHPjava.util.concurrent 在shorturl项目中的应用

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 进程、线程、轻量级进程、协程和go中的Goroutine 那些事儿

    电话面试被问到go的协程,曾经的军伟也问到过我协程。虽然用python时候在Eurasia和eventlet里了解过协程,但自己对协程的概念也就是轻量级线程,还...

    财主刀刀
  • ImageMagick and JMagick install on Mac OSX

    接的遗留代码,在本地运行,有jmagick-6.4.0.jar 但是出现错误: javax.servlet.ServletException: java.lan...

    财主刀刀
  • HBase client访问ZooKeeper获取root-region-server DeadLock问题(zookeeper.ClientCnxn Unable to get data of zn

    2012年11月28日 出现故障," Unable to get data of znode /hbase/root-region-server" 问题比较诡异...

    财主刀刀
  • BIO与反应器模式

      我们熟知的Socket编程就是一种BIO,一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作)。阻塞的原因在于:操作系统...

    Java阿呆
  • 记一次Date引起的线上BUG处理

    在Java8以前,每每操控时间,我们经常使用的类库就是Date,并且会通过SimpleDateFormat类对时间进行格式化。你可知道?Date类是一个可变类,...

    程序员小明
  • python多线程开发

           通过threading.Thread创建一个线程对象,target是目标函数,name可以指定自己喜欢的名字,线程的启动需要借助start方法。线...

    py3study
  • java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?

    死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了。 死锁 死锁是多线程中最差的一种情...

    Java技术栈
  • Java线程池-ThreadPoolExecutor源码解析(基于Java8)

    所以需要通过线程池协调多个线程,并实现类似主次线程隔离、定时执行、周期执行等任务.

    JavaEdge
  • 学习Java并发技术,先从这篇文章开始

    这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类。当然这些都是并发编程的基本知识,除了使用这些工具以外,Java并发编程中涉及到的技术原理十分丰富。为...

    Java技术江湖
  • 线程池

    不光是线程池,池化思想在诸多地方有着很好的应用,比如对象池、连接池等等。。一般运用池化思想的都是一些比较消耗系统资源的操作,通过池化,可以降低内存消耗,并且可以...

    AlbertZhang

扫码关注云+社区

领取腾讯云代金券