线程池生命周期管理
线程池运行的状态,并不是用户显式设置的,而是伴随着线程池的运行,由线程池内部来维护。线程池内部使用一个变量维护两个值:运行状态(runState)和线程数量(workerCount)。在具体实现中,线程池将运行状态(runState)和线程数量(workerCount)两个关键参数的维护放在了一起。
真正的强者是认清了生活的本质,并且去热爱他的人。
线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,或者涉及到一些复杂线程操作需要重复开启线程。线程过多会带来额外的开销,包括创建线程的开销,调度线程的开销等等,同时也降低了计算机的整体性能。
线程池能维护多个线程,等待监督管理分配可并发执行的任务,这种做法一方面避免了处理任务时创建销毁线程开销的代价,另一方面也避免了线程数量膨胀的过分调度问题,保证了对内核的充分利用。
Java中对线程池的实现都是基于ThreadPoolExcutor类,它能带来一系列的好处:
文章比较长,信息量比较大,建议在 pc 上阅读。文章标题是为了呼应前文,其实可以单独成文的,主要是希望读者看文章能系统看。
本文关注以下几点内容:
基本上本文把以上几点都说清楚了,我假设读者看过上一篇文章中对 AbstractQueuedSynchronizer 的介绍 ,当然如果你已经熟悉 AQS 中的独占锁了,那也可以直接看这篇。各小节之间基本上没什么关系,大家可以只关注自己感兴趣的部分。
其实这篇文章的信息量很大,初学者估计至少要 1 小时才能看完,希望本文对得起大家的时间。
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为,这是Spring为我们提供的强大工具箱。使用事务传播可以为我们开发提供许多便利。但是人们对他的误解也很多,你一定听过“service方法事务最好不要嵌套”的传言。要想正确使用工具首先需要了解工具。
事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另外一个方法时事务如何传播。
伪代码说明:
1 | public void methodA(){ |
代码中methodA()方法嵌套调用了methodB()方法,methodB()的事务传播行为由@Transaction()设置来决定。
所有的数据库访问技术都有事务处理机制,这些技术提供了API用于开启事务,提交事务完成数据操作,或者在发生错误的时候回滚数据。Spring的事务机制是用统一的机制来处理不同数据访问技术的事务处理,Spirng的事务机制提供了一个PlatformTransactionManager接口,不同的数据访问技术的事务使用不同的接口实现,如下表:
| 数据访问技术 | 实现 |
|---|---|
| JDBC | DataSourceTransactionManager |
| JPA | JPATransactionManager |
| Hibernate | HibernateTransactionManager |
| JDO | JdoTransactionManager |
一句话概括:JDBC是所有框架操作数据库必须要用的,有数据库厂商提供,但是为了方便JAVA程序员调用各个数据库,各个数据库厂商都要实现JDBC接口(提供统一的标准)