线程池的配置和监控

1、合理的配置线程池 要想合理的配置线程池,就必须首先分析任务特性,可以从以下几个角度来进行分析: 任务的性质:CPU密集型任务,IO密集型任务和混合型任务。 任务的优先级:高,中和低。 任务的执行时间:长,中和短。 任务的依赖性:是否依赖其他系统资源,如数据库连接。 任务性质不同的任务可以用不同规模的线程池分开处理。CPU密集型任务配置尽可能小的线程,如配置Ncpu+1个线程的线程池。IO密集型任务则由于线程并不是一直在执行任务,则配置尽可能多的线程,如2*Ncpu。 ...

Java锁(二)ReentrantLock独占锁分析

ReentrantLock的功能是实现代码段的并发访问控制,是一种排它锁,也就是通常意义上所说的锁,内部有两种实现NonfairSync和FairSync,公平锁和非公平锁,默认采用非公平锁策略。ReentrantLock的实现不仅可以替代隐式的synchronized关键字,而且能够提供超过关键字本身的多种功能。 1、ReentrantLock的使用 class X { private final ReentrantLock lock = new ReentrantL ...

Java并发编程之锁

作为一个java开发者,并发编程是不可或缺的,在并发的过程,Lock是并发的关键, 本文主要从排它锁和共享锁的实例来讲解锁的机制。 本文主要从以下方面来讲解锁的原理以及使用: 1、AbstractQueuedSynchronizer分析 2、ReentrantLock独占锁分析 3、CountDownLatch共享锁分析 4、ConditionObject分析 5、CyclicBarrier分析

Java锁(一)AbstractQueuedSynchronizer分析

作为一个java开发者,并发编程是不可或缺的,在并发的过程,Lock是并发的关键, 本系列文章主要来讲解锁的原理和机制。 在理解J.U.C原理以及锁机制之前,我们来介绍J.U.C框架最核心也是最复杂的一个基础类:java.util.concurrent.locks.AbstractQueuedSynchronizer。 上面的继承体系中,AbstractQueuedSynchronizer是CountDownLatch/Semaphore/RenntrantRea ...

线程池的拒绝策略

默认提供4种拒绝策略,可以自定义实现RejectedExecutionHandler进行扩展 1、AbortPolicy 2、DiscardPolicy 3、DiscardOldestPolicy 4、CallerRunsPolicy AbortPolicy,无法处理任务任务的时候,直接抛出异常, public static class AbortPolicy implements RejectedExecutionHandler { /** ...

线程池BlockingQueue排队策略

排队有三种通用策略 1、直接提交。无缓冲等待队列SynchronousQueue,它将任务直接提交给线程而不保持它们。在此,如果不存在可用于立即运行任务的线程,则试图把任务加入队列将失败,因此会构造一个新的线程。此策略可以避免在处理可能具有内部依赖性的请求集合时出现锁定。直接提交通常要求无界 maximumPoolSizes 以避免拒绝新提交的任务。当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。 2、无界队列。使用无界队列(例如,不具有预定义容量的 Li ...