池化思想
资源反复利用,用后归还,免去大量建立销毁浪费的时间和资源,建立和销毁占用的资源还是很多的
字符串常量池
常量池独立于栈和堆,以下两种创建方式区别
1,直接保存常量池的内容
String s1 = “直接保存”
2,new String间接保存
String s2 = new String(“间接保存”)
区别:
- 直接保存,无论创建多少个都是相同的
- 间接保存实际上保存的是地址值,指向线程池,此方式会产生两个对象;如果多次间接保存,例如:
String s3 = new String(“间接保存”)
String s4 = new String(“间接保存”)
String s5 = new String(“间接保存”)
实际上在常量池中只创建了一个"间接保存"的对象,而引用对象却创建了3次
线程池
与传统相比的优点
- 传统的线程实现方式有包含了线程创建 线程销毁 的时间,而线程是可以复用的,因此引入线程池,把线程创建和销毁 改为 用后归还,不销毁,重复利用资源,提高线程利用率,提高程序的响应速度
- 便于统一管理线程对象
- 可以控制最大并发量
线程池模型——银行
柜台窗口:线程,且不销毁
等待区:等待队列
窗口不够用时:增加线程
等待区没有座位时:拒绝策略——报异常或交给某个线程去左
窗口空闲太多:减少线程
线程池创建
JUC并发工具包提供了ThreadPoolExecutor创建线程池,ThreadPoolExecutor有8个参数,分别为:
- corePoolSize:核心线程数——永不关闭的柜台窗口数
- maximumPoolSize:最大线程数——最多的窗口总数
- keepAliveTime:线程存活时间——非核心线程过多长时间没有接到任务就销毁——需要设置单位unit
- unit:TimeUnit.SECONDS 或TimeUnit.MICROSECONDS等等都可以
- BlockingQueue :等待队列,new ArrayBlockingQueue<>(capacity:10)这里capacity的值设为10
- ThreadFactory:线程工厂——无需自己创建,直接调用Executors.defaultThreadFactory()
- RejectedExecutionHandler:拒绝策略——new ThreadPoolExecutor.AbortPolicy()被拒绝的任务的处理程序,抛出一个 RejectedExecutionException
创建好之后用ExecutorService类对象来接收,之后就可以直接调用了
例如:利用lambda表达式
for(){
executorService.execute( ()->{ 线程业务逻辑 } );
}//线程池会自动调整当前线程数
executorService.shutdown();//关闭线程池
参考:
线程池详解
数据库连接池
优点
- 资源重用
- 更快的系统反应速度
- 新的资源分配手段
- 统一的连接管理,避免数据库连接泄漏
参考1
参考2
优秀的开源数据库连接池代理
(1)DBCP 是Apache提供的数据库连接池。tomcat服务器自带dbcp数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持。
(2)C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以,hibernate官方推荐使用。
(3)Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点.
(4)BoneCP 是一个开源组织提供的数据库连接池,速度快。
(5)Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool优点于一身的数据库连接池,但是速度不确定是否有BoneCP快。