为什么不建议用Executors启动线程池
*队列LinkedBlockingQueue是没有边界的队列,请求多会造成OOM
*建议使用ThreadPoolExecutors
线程池中提交一个任务的流程?
1先判断线程池是否有线程,如果与就直接执行,没有就放队列
2如果队列满了,就拒绝(代码要做处理)
线程池有的状态
1. Running(运行状态):线程池已经创建并且正在运行,可以接受新的任务并处理已提交的任务。
2. Shutdown(关闭状态):线程池不再接受新的任务,但会继续处理已提交的任务,直到所有任务完成。在关闭状态下,线程池不会创建新的线程。
3. Stop(停止状态):线程池不再接受新的任务,并且会中断正在执行的任务。它会尝试终止所有的工作线程。
4. Tidying(整理状态):所有的任务都已经终止,工作线程数量已经降为零。线程池会进行一些清理工作,例如关闭底层线程池等。
5. Terminated(终止状态):线程池已经完全终止,不再接受任务,也不会处理已提交的任务。
优雅的停止线程
*stop(),释放synchronized,不会释放RreetranLock
*建议用字段(再线程做判断)
*用全局变量控制
tomcat是如何定义线程的
*tomcat中线程池走构造就会启动所有核心线程池
*tomcat的思想优先启动线程,线程达到上线才加入队列
线程池怎么设置核心线程数和最大线程数
*先看是CPU密集型 还是IO密集型,或者是混合型
*CUP密集可以+1
*IO密集可以X2
*核心业务可以多,非核心可以少,
*最终还是要压测得到合适的
volatile修饰的变量可以多线程可见
并发中的原则性要加锁实现
产生死锁的原因
1资源只能被一个线程使用
2线程阻塞 不释放被占用资源
3若干线程头尾相连的循环等待资源关系
建议:加锁顺序 。 设置超时时间,死锁检查
sychronize和ReetrantLock的区别
Java 中主要有以下几种锁:
*互斥锁(synchronized)**:互斥锁是 Java 中最常用的锁,它可以保证同一时间只有一个线程可以访问某个资源。
*读写锁(ReentrantReadWriteLock)**:读写锁可以同时允许多个线程读取一个资源,但只有一个线程可以写入该资源。
*公平锁(FairLock)**:公平锁保证等待时间最长的线程可以最先获得锁。
*非公平锁(NonfairLock)**:非公平锁不保证等待时间最长的线程可以最先获得锁。
*自旋锁(SpinLock)**:自旋锁是不需要操作系统参与的锁,它可以提高锁的性能。 耗cpu 建议在时间短的用
*乐观锁(OptimisticLock)**:乐观锁假设在大多数情况下,多个线程不会同时访问同一个资源,因此它不会对资源进行加锁。
如果需要保证同一时间只有一个线程可以访问某个资源,那么可以使用互斥锁。如果需要同时允许多个线程读取一个资源,但只有一个线程可以写入该资源,那么可以使用读写锁。如果需要保证等待时间最长的线程可以最先获得锁,那么可以使用公平锁。如果不需要保证等待时间最长的线程可以最先获得锁,那么可以使用非公平锁。如果需要提高锁的性能,那么可以使用自旋锁。如果需要在读操作时不加锁,那么可以使用乐观锁
from
https://www.yuque.com/tulingzhouyu/sfx8p0/dr3wi1f7uxi961uo?singleDoc# 密码:bghr