AQS和ThreadPoolExecutor的对比(对话讨论形式说明)

本篇几乎全是文字了,文字还比较多,没办法,越接近底层,越抽象,耐心看吧。。。想要突破瓶颈,只能静下心来!

我:问个问题
		AQS
		通过CAS status变量,来控制锁对吧
		而且,里面维护了一个队列,用来,添加线程Node到队列中。。。
		由实现类来实现具体的获取锁的逻辑,和释放锁的逻辑
		那么ThreadPoolExecutor中的worker也是继承了AQS
		那么问题就来了,这里的Worker继承了AQS,貌似没有用它的队列
		因为,任务是添加到线程池的队列里。。。
		Worker自身作为线程,是添加到线程池的Hashset里面的
		那么,Worker是不是没有用AQS的队列了?
		哪位老铁出来聊聊
甲:他自己的队列应该也继承了aqs
我:谁的队列?
		@甲
		线程池的任务队列,没有继承AQS
		我个人感觉,我看代码,是觉得,Worker继承AQS主要是用了AQS的锁功能。。
		没用用它的队列存放线程的功能
		因为,现在线程都放到线程池了,不可能线程池在分配任务的时候,把多个线程去执				   行同一个任务。。
		否则线程池的队列就没起到作用了
乙:@我 概念有点混淆了
丙:膜拜大佬
我:@乙 帮梳理下
乙:AQS的队列是当多个线程获取同一个锁对象时,发现该锁对象被其他线程所占用时,会将当前线	程抽	象成一个节点放到AQS的CLH双向队列中,而线程池的Woker类他起到的作用就是帮忙从线程池的阻塞队列中不断获取任务去执行可以把这过程看成是一个串行的执行过程
丁:完全看不懂
丁:膜拜大佬
我:@乙 所以,Worker线程,每次只会执行一个任务
		不会,多次分任务给他
		当线程都在忙的时候,线程池,会把任务放到它自己的任务队列里面。。。
		所以,线程池中的任务,是不会发生线程竞争的。。。
		从而避免了,线程的上下文切换,这也是线程池的设计初衷之一。。
乙:@我 是的不会发生冲突
		你可以再看下线程池工作原理那块代码
		我记得woker类通过一个for循环去队列中拿任务
		每次取出一个去执行
我:好的
		我现在还有个忙点就是,这个worker继承AQS,主要用它的锁功能,那么,worker的锁用在什么地方了
		线程池自己有一把mainLock用来,同步线程去获取任务
乙:线程池的作用是复用创建好的线程,降低资源消耗,提高资源利用率,创建出来的线程去执行任务,操纵共享资源(也就是访问临界资源的时候)才会有线程安全问题,那线程安全的问题解决方法是什么呢?自然是加锁(lock,Synchorized)或无锁并发(CAS),现在拿加锁来说,如果对共享资源加锁后,别的线程要想访问是不是就不能访问了,这时候这个像访问的线程就需要加到CLH阻塞队列中
		这样逻辑是不是清晰一些
		我觉得woker类更多的是为了保证可见性
		@我 ...  这个worker继承AQS,主要用它的锁功能,那么,worker的锁用在什么地方了
		这块有没有去想过
		@我 有可能也是利用了lock的可中段特性

总结:
通过上述对话,我们对AQS和ThreadPoolExecutor有个更具体的认识

AQS通过CAS volitate state 变量实现锁功能,同时,它自己有个CLH队列,它的这个队列是存放竞争线程的,如果线程竞争失败,就进入队列等待,由具体的AQS实现类来实现具体的获取锁释放锁的逻辑,这里,其实就是修改state值。

ThreadPoolExecutor有个Worker线程类,它也继承了AQS,tpool自身也有个队列workQueue,还有个HashSet集合,一把ReentrantLock mainLock锁,这是tpool的一部分结构。

首先我们来说明下Worker线程类继承了AQS,Worker继承AQS主要是实现了它的获取锁和释放锁的功能,也就用到了这个功能,因为tpool中的线程不会发生竞争,所以,AQS的队列不会存放等待的线程,也就是说,Worker没用用到AQS的队列功能,只是用它的锁功能。
那么这个Worker锁用在哪里了?

 也就这一个方法里面用到自己的锁
 final void runWorker(Worker w)

在这里插入图片描述

当tpool中任务过多的时候,会把任务放到workQueue等待空闲的线程来获取并执行该任务

HashSet用来存放tpool中的线程的,包括核心线程和应急线程

mainLock用来同步线程集合workers(HashSet),因为可能多个线程一起调用了execute方法,这个时候,向workers中添加线程就需要同步

暂时只了解到这个程度,后面再更新吧。。。

你学废了吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值