java.util.concurrent的执行器与线程池

本篇主要继续盘点 java.util.concurrent 中的执行器与线程池 ThreadPoolExecutor的构造 大量的线程创建与销毁是一个十分消耗系统资源的操作, 通过 线程池-线程工厂-线程执行器 可以高效的使用线程资源, 线程可以被重复利用, 适合大量短线程的情景. ThreadPoolExecutor 是线程池中非常重要的一个类. 其继承关系如下图所示 使用 TheadPoolExecutor 我们可以得到一个线程执行器,方便地执行各种大量重复的线程. ThreadPoolExecutor 有多种构造方法: public class ThreadPoolExecutor extends AbstractExecutorService { ….. public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long … Continue reading “java.util.concurrent的执行器与线程池”

java.util.concurrent的工具

本篇主要继续盘点 java.util.concurrent 中的工具包 ReentrantLock/Semaphore/CountDownLatch/CyclicBarrier/Phaser/Exchanger 如上一篇文章中写到 ReentrantLock 提供了重入锁的调用, 通过 lock()/unlock() 实现加锁/解锁的操作. 例如 class LockTest implements Runnable { ReentrantLock lock; public LockTest(ReentrantLock lock) { this.lock = lock; } @Override public void run(){ try{ lock.lock(); //do something }finally{ lock.unlock(); } } } /* * * * * * ReentrantLock lock = new ReentrantLock(); Thread t1 = new Thread(new … Continue reading “java.util.concurrent的工具”

AbstractQueuedSynchronizer

本篇主要继续盘点java.util.concurrent中的工具包 AbstractQueuedSynchronizer 曾在先前的文章里介绍过, ReentrantLock是基于API实现的重入锁的数据结构. 在API层面的具体实现而是依靠AbstractQueuedSynchronizer实现的. AbstractQueuedSynchronizer本质是一个修改后 CLH(Craig, Landin and Hagersten) 队列. CLH队列是由FIFO的队列实现的, 简单的 CLH 队列节点存在一个 locked 域, 每一个节点存放一个竞争资源的线程. 当一个节点尝试获取锁时, 会在队列尾端插入一个节点, 对队列的 tail 域进行 CAS 操作, 反复试图使将节点插入到队列尾端. 并获取其前驱节点的 locked 的域, 该线程会在其前驱节点的 locked 域旋转, 直到前驱节点释放锁将 locked 置为 false. Java AbstractQueuedSynchronizer 是一个Abstract类, ReentrantLock 中的 Sync 类继承了该类, Sync 又被 NonfairSync 和 FairSync 所继承, 分别用于公平锁与非公平锁. ReentrantLock 默认是非公平锁, 即加锁时无需考虑排队问题, 可以直接尝试获取锁, 获取失败会假如排队队列. … Continue reading “AbstractQueuedSynchronizer”

1 Comment so far