一、应用
1、spring 中应用
tomcat,每次访问生成一个线程
数据库链接池
定时任务
异步方法@Async
二、线程池
作用
线程池里面有一定数量的线程,让它们执行各种各样的任务,线程执行完任务,不会销毁自己,继续执行下一个任务。避免频繁的创建线程、销毁线程。
ExecutorService threadPool = Executors.
newFixedThreadPool(10)
threadPool.execute()或者submit()
工作原理
提交任务,先看线程池里的线程数是否小于
corePoolSize也就是10,如果是小于直接创建线程来执行任务,次线程执行完任务以后,回去一个队列里面获取新的任务,如果没有任务就会阻塞等待新的任务到来。
线程池参数,
1、corepoolsize,默认创建线程数量
2、最多创建线程数量
当默认的线程,使用完了,就会创建额外的线程
3、间隔时间
额外的线程执行完以后,经过设定的时间销毁。
4、任务队列
无界队列与有界队列
无界队列有可能出行内存问题。
有界队列满了以后,任务会根据策略来执行,
1、丢弃警报,2、丢弃不警报,3,丢弃时间最久的任务,4、在线程池外创建线程。
也可以自定义策略,多余的任务可写入数据库中或者队列中异步执行。
三、ThreadLocal
线程操作线程内的变量,不去操作公共内存的变量,保证线程的安全性。
四、锁
synchronized,
JVM层面的关键字,moniter指令,
moniterenter加锁,moniterexit解锁。
在对象头中有计数器,当线程获取对象时
计数器+1,可重入,同一个线程连续加锁。等待队列
可修饰类,对象,方法变量等。 无论修饰什么都是对象级别的加锁。
jdk1.8以后经过优化,有锁升级功能,
无锁,偏向锁(默认上一个线程),轻量级(cas),重量级锁。
重量级锁涉及到用户态,内核态的的切换,很浪费资源
lock
jdk中的类
Reentranlock
默认非公平锁,
实现原理,AQS
State变量——cas——失败后入队列等待——释放锁后唤醒
宕机情况
服务器宕机以后,队列中的任务会丢失。要保存的话需要再任务开始时在数据库中存入任务信息和状态,结束时更改状态。
网友评论