问题:微博短链项目应用到哪些concurrent包中的类,类的用途是什么?场景是怎样?效果?
int
值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic
包规范。AtomicInteger
可用在应用程序中(如以原子方式增加的计数器),并且不能用于替换 Integer
。但是,此类确实扩展了 Number
,允许那些处理基于数字类的工具和实用工具进行统一访问。 (jdk文档)
场景:ThreadPoolExecutor的成员变量,记录等待线程数,确保不超出最大线程数
效果:正常,保证不超出ExecutorService
,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors
工厂方法配置。 线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法。每个 ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数。 (jdk文档)
场景:启动高中低优先级的Executor,设置不同的最大线程数,最大等待数执行不同级别任务;如异步修复短链ext信息,异步读取mcq数据入库入缓存
效果:正常,应对每日数千万级写入请求;但三种executor的设置让人困惑,maxPriorityExecutor的大小和minPriorityExecutor一样,normalPriorityExecutor却是最大的线程和等待数?
Lock
,它具有与使用 synchronized
方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。 ReentrantLock
将由最近成功获得锁,并且还没有释放该锁的线程所拥有。当锁没有被另一个线程所拥有时,调用 lock
的线程将成功获取该锁并返回。如果当前线程已经拥有该锁,此方法将立即返回。可以使用 isHeldByCurrentThread()
和 getHoldCount()
方法来检查此情况是否发生。 synchronized缺点 a.只有一个"条件"与锁相关联,这对于大量并发线程的情况是很难管理(等待和唤醒);b.多线程竞争一个锁时,其余未得到锁的线程只能不停的尝试获得锁,而不能中断
场景:创建memcache client建立连接时加锁,避免多次创建socket