并发原理2





     







如果在一个整型量上维护多种状,就一定需要按位切割使用量,
量切分成了两个部分,高16位表示,低16位表示写,划分方式如5-8所示。

当前同步状值为S,写状等于S&0x0000FFFF(将高16位全部抹去),态等S>>>16(无符号0右移16位)。当写状增加1,等于S+1,当增加1,等于S+(1<<16),也就是S+0x00010000
根据状的划分能得出一个推S不等于0,当写状S&0x0000FFFF)等于0则读
S>>>16)大于0,即读锁已被取。














·添加元素1列更新head点的next元素1点。又因tail点默情况下等于head点,所以它next点都指向元素1点。
·添加元素2列首先置元素1点的next元素2点,然后更新tail点指向元素2点。
·添加元素3tail点的next元素3点。
·添加元素4置元素3next元素4点,然后将tail点指向元素4点。
主要做两件事情:
第一是将入队节置成当前列尾点的下一个点;
第二是更新tail点,如果tail点的next点不空,将入队节置成tail点,如果tail点的next空,将入队节置成tailnext点,所以tail点不是尾点。



队:并不是每次出队时都更新head点,当head点里有元素,直接head点里的元素,而不会更新head点。只有当head点里没有元素,出操作才会更新head点。
首先头节点的元素,然后判断头节点元素是否空,如果空,表示另外一个线程已经进行了一次出操作将该节点的元素取走,如果不空,使用CAS的方式将头节点的引用设置null,如果CAS成功,直接返回头节点的元素,如果不成功,表示另外一个线程已行了一次出操作更新了head点,致元素生了化,需要重新头节点。










线程池的理流程:
1线程池判断核心线程池里的线程是否都在行任。如果不是,则创建一个新的工作线程来行任。如果核心线程池里的线程都在行任则进入下个流程。
2线程池判断工作列是否已经满。如果工作列没有将新提交的任个工作列里。如果工作了,则进入下个流程。
3线程池判断线程池的线程是否都于工作状。如果没有,则创建一个新的工作线行任。如果已经满了,给饱和策略来个任




ThreadPoolExecutorexecute方法分下面4种情况:
1)如果当前运行的线程少于corePoolSize则创建新线程来行任(注意,一步需要取全局)。
2)如果运行的线程等于或多于corePoolSize将任加入BlockingQueue
3)如果无法将任加入BlockingQueue列已),则创建新的线程来理任(注意,一步需要取全局)。
4)如果建新线程将使当前运行的线程超出maximumPoolSize,任将被拒,并RejectedExecutionHandler.rejectedExecution()方法。






线程池中的线行任分两种情况:
1)在execute()方法中建一个线,会让这线行当前任
2线行完1的任后,会反复从BlockingQueue取任行。







关闭线程池:
过调线程池的shutdownshutdownNow方法来关闭线程池。

原理:
历线程池中的工作线程,然后逐个线程的interrupt方法来中断线程,所以无法响中断的任可能永无法止。

别:
shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在行或停任线程,并返回等待行任的列表。
shutdown只是将线程池的状态设置成SHUTDOWN,然后中断所有没有正在行任线程。

只要用了两个关方法中的任意一个,isShutdown方法就会返回true
当所有的任都已关后,才表示线程池关成功,这时调isTerminaed方法会返回true












FixedThreadPool
1)如果当前运行的线程数少于corePoolSize则创建新线程来行任
2)在线程池完成预热之后(当前运行的线程数等于corePoolSize),将任加入LinkedBlockingQueue
3线行完1中的任后,会在循中反复从LinkedBlockingQueue取任行。


FixedThreadPool使用无界LinkedBlockingQueue为线程池的工作列(列的容量
Integer.MAX_VALUE)。使用无界列作工作列会对线程池来如下影响。
1)当线程池中的线程数达到corePoolSize后,新任将在无界列中等待,因此线程池中线程数不会超corePoolSize
2)由于1,使用无界maximumPoolSize将是一个无效参数。
3)由于12,使用无界keepAliveTime将是一个无效参数。
4)由于使用无界列,运行中的FixedThreadPool(未行方法shutdown()shutdownNow())不会拒(不会RejectedExecutionHandler.rejectedExecution方法)。





SingleThreadExecutor
1)如果当前运行的线程数少于corePoolSize(即线程池中无运行的线程),则创建一个新线程来行任
2)在线程池完成预热之后(当前线程池中有一个运行的线程),将任加入Linked-BlockingQueue
3线行完1中的任后,会在一个无限循中反复从LinkedBlockingQueue取任行。






CachedThreadPool
1)首先SynchronousQueue.offerRunnable task)。如果当前maximumPool中有空闲线正在SynchronousQueue.pollkeepAliveTimeTimeUnit.NANOSECONDS),那么主线offer操作与空闲线行的poll操作配成功,主线程把任线行,execute()行完成;否则执行下面的步2)。
2)当初始maximumPool空,或者maximumPool中当前没有空闲线,将没有线
SynchronousQueue.pollkeepAliveTimeTimeUnit.NANOSECONDS)。种情况下,步1)将失。此CachedThreadPool建一个新线行任execute()方法行完成。
3)在步2)中新建的线程将任务执行完后,会SynchronousQueue.pollkeepAliveTimeTimeUnit.NANOSECONDS)。poll操作会闲线程最多在SynchronousQueue中等待60。如果60内主线程提交了一个新任(主线行步1)),那么个空闲线程将行主线程提交的新任;否个空闲线程将止。由于60秒的空闲线程会被止,因此长时间保持空CachedThreadPool不会使用任何源。


SynchronousQueue是一个没有容量的阻塞列。每个插入操作必等待另一线程的对应移除操作,反之亦然。CachedThreadPool使用SynchronousQueue,把主线程提交的务传递给闲线行。






ScheduledThreadPoolExecutor
1)当ScheduledThreadPoolExecutorscheduleAtFixedRate()方法或者scheduleWith-
FixedDelay()方法,会向ScheduledThreadPoolExecutorDelayQueue添加一个实现
RunnableScheduledFuture接口的ScheduledFutureTask
2线程池中的线程从DelayQueueScheduledFutureTask,然后行任




ScheduledThreadPoolExecutor中的线1行某个周期任4个步骤:
1线1DelayQueue取已到期的ScheduledFutureTaskDelayQueue.take())。到期任是指ScheduledFutureTasktime大于等于当前时间
2线1ScheduledFutureTask
3线1修改ScheduledFutureTasktime下次将要被行的时间
4线1个修改time之后的ScheduledFutureTask放回DelayQueue中(Delay-Queue.add())。




ScheduledThreadPoolExecutor取任程:
1Lock
2取周期任
·如果PriorityQueue空,当前线程到Condition中等待;否则执行下面的2.2
·如果PriorityQueue元素的time时间比当前时间大,到Condition中等待到time时间;否
则执行下面的2.3
·PriorityQueue元素(2.3.1);如果PriorityQueue空,则唤醒在Condition中等待
的所有线程(2.3.2)。
3Lock
ScheduledThreadPoolExecutor在一个循行步2,直到线程从PriorityQueue取到一
个元素之后(2.3.1之后),才会退出无限循束步2)。





ScheduledThreadPoolExecutor添加任程:
1Lock
2)添加任
·PriorityQueue添加任
·如果在上面2.1中添加的任PriorityQueue元素,醒在Condition中等待的所有线程。
3Lock





FutureTask:

FutureTask于未启或已启态时FutureTask.get()方法将线程阻塞;
FutureTask于已完成状态时FutureTask.get()方法将线程立即返回果或抛
出异常。
FutureTask于未启态时FutureTask.cancel()方法将致此任不会被行;
FutureTask于已启态时FutureTask.canceltrue)方法将以中断行此任务线
的方式来试图停止任
FutureTask于已启态时FutureTask.cancelfalse)方法将不会正在行此任线生影响(正在行的任运行完成);
FutureTask于已完成状态时FutureTask.cancel)方法将返回false





开始FutureTask于未启或已启,等待列中已3线程(ABC)在等待。此线Dget()方法将线D也到等待列中去等待。
线Erun()方法,会列中的第一个线A线A醒后,首先把自己从列中除,然后醒它的后继线B,最后线Aget()方法返回。线BCD重复A线理流程。最,在列中等待的所有线程都被级联唤醒并从get()方法返回。



























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值