概要
线程池其实之前已经发过一篇了,之前那篇聊的比较细节,这次就泛泛地聊一下。目前我多线程开发,基本都不直接创建 Thread 进行操作,而是使用线程池去完成任务,因为线程池有几大好处。所以几天就聊一下以下几个方面
- 线程池的优势
- 线程池的实现原理
- ThreadPoolExecutor
- jdk 中预定义的线程池
- 合理配置线程池
biu~biu~biu~
容器,这个概念在我刚开始接触的时候,其实很模糊,到处都可以看到容器这个概念。到现在我的理解起来就很简单了,就是一个装载空间,每个容器有它一定的功能,可进可出,就是 container。像并发容器,就像 ConcurrentHashMap,ConcurrentSkipArrayList,LinkedBlockingQueue 等,可以装载 java 对象,提供线程安全的一些功能。由于目前我常用的 jdk 是 8 的版本,所以这一次就聊 jdk8 里面的一些并发容器,至于网上经常拿 jdk7 和 jdk8 的并发容器进行比较,而且面试也可能问,但是官网上已经下载不到了,我也就懒得去找 jdk7 来对比了
所以我们这次要聊的有
我们除了可以使用 synchronized 内置锁外,jdk 还提供了 ReentrantLock 等显示锁,synchronized 方便使用,显示锁在某些方面更灵活。而显示锁的基础是 AQS,其实前几篇提到的几个工具类也是由 AQS 实现的,比如 CountDownLatch,CyclicBarrier 等,可以说 AQS 占有 jdk 并发包的半壁江山。所以今天我们就聊聊以下几个方面,并且看一点源码
前几天生产上出现一个问题,使用 spring 集成 quartz 定时器无故停住了,重启又好了。导致一些功能受到限制,查询和沟通了一段时间才解决。
描述:表象,订单状态全部卡在了一个状态下,不再改变;日志,定时器执行一段时间后不再执行,而且是所有的定时器都不执行了。
双重校验锁:即在代码 synchronized 代码块之前和代码块开始,都对一个变量进行校验
javax.xml.parsers.FactoryFinder 类里面有个方法 static
1 | try { |
在教程中会使用 javac-algs4 和 java-algs4 命令进行编译和执行 java 文件,classpath 默认有 algs4.jar。所以需要自定义 javac 和 java
windows
1 | E:\de_learn\algorithms\homework\dequeue_ramdom>javac-algs4 Permutation.java |
linux
1 | $ javac-algs4 PercolationStats.java |