多线程

一、应用

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——失败后入队列等待——释放锁后唤醒


宕机情况

服务器宕机以后,队列中的任务会丢失。要保存的话需要再任务开始时在数据库中存入任务信息和状态,结束时更改状态。

你可能感兴趣的:(多线程)