一. 线程池概述
在介绍线程池之前,先说一下为什么在开发中要使用线程池,个人认为主要有一下的原因:
- 开发中使用线程的时候,大部分线程执行的时间很短,频繁的创建、启动、销毁线程带来不必要的资源消耗。
- 线程的创建、挂起、唤醒等操作都需要依靠CPU调度,大量的线程会频繁进行上下文切换,特别是任务执行时间短、任务数量多的情况,大量时间将花在上下文切换上,又耗时,又耗资源。
- 无法对任务做统一的管理、分配、和监控等。
在介绍线程池之前,先说一下为什么在开发中要使用线程池,个人认为主要有一下的原因:
AQS(AbstractQueuedSynchronizer),队列同步器,Java中很多同步类都是基于AQS实现的,比如:ReentrantLock、Semaphore、CountDownLatch等。
AQS提供了一个实现阻塞锁和相关同步组件的框架,这个框架实现依赖于FIFO(first-in-first-out,先进先出)的等待队列来完成获取资源线程的排队工作。AQS是绝大多数同步器的基础,它的内部使用一个 int 型的变量表示同步状态(资源状态),AQS并不维护这个状态的值,只是提供了一系列的原子更新方法,getState、setState、compareAndSetState,而由继承AQS的子类去重写特定定的方法实现对共享资源的获取和释放,而其他的比如线程排队、线程挂起、线程唤醒出队等已经在AQS中实现好了(典型的设计模式中模板方法模式的使用)。
本篇文章主要记录自旋锁、CLH锁、MCS锁的学习所得。关于自旋锁和CLH锁、MCS锁,网上已经有很多内容,而且很类似;学习就是学习前人经验,理解、总结,化为己用,因此,虽然网上有很多相关的内容,我也是参考了这些内容,我依然选择记录下了自己的理解,方便自己查阅。
享元模式(Flyweight Pattern)
,运用共享技术有效的支持大量的细粒度对象。换句话说,使用享元模式对相同或者类似的对象进行复用,以此来减少少相同或者类似的对象的创建数量,从而减少内存占用,提高性能。
CAS在网上已经有数不清的文章,这里只是自己在学习过程中的一个记录,方便以后查阅。
Java中CAS全称Compare and Swap,也就是比较交换。在Java同步工具中,经常可以看到CAS的身影。在Doug Lea大神提供的J.U.C并发包中,可以说CAS是实现整个J.U.C包的基石。