学习目标:
- Java面试题
- MySQL面试题
- Redis面试题
学习内容:
2024-01-27:
- 为什么不建议使用Executors创建线程池
- 线程池有哪几种状态
- Sychronized和ReentrantLock有什么不同
具体内容:
为什么不建议使用Executors创建线程池
Executors创建的线程池使用的队列是LinkedBlockingQueue(无界阻塞队列),如果使用该线程池执行任务,如果任务过多会一直加入队列进行等待,程序占用的内存会越来越多,直至耗尽内存,OOM内存溢出
线程池有哪几种状态
Running:运行状态,能接受新的任务
Shutdown:关闭状态,不再接受新的任务,但是会执行队列等待的任务
Stop:停止状态,不再接受新的任务,并且会中断处理中的任务
Tidying:整理状态,中间状态不做任何处理,留给子类自定义使用
Terminated:终止状态,线程池所有线程都已经终止。
Sychronized和ReentrantLock有什么不同
Sychronized | ReentrantLock |
---|---|
Java关键字 | JDK提供的类 |
JVM层面的锁 | API层面的锁 |
自动加锁和释放锁 | 需要手动加锁和释放锁 |
不可获取当前线程是否上锁 | 可获取当前线程是否上锁 |
非公平锁 | 公平锁或非公平锁 |
不可中断 | 可中断 |
锁是对象,锁信息保存在对象头中 | int类型的state标识来标识锁的状态 |
底层有锁升级的过程 | 没有锁升级过程 |