为什么不建议用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



















