1.java内存模型:
线程工作内存 <-> 主内存
2.并发问题解决方案:
无锁:
局部变量: 善用局部变量可避免线程安全问题,因为局部变量在各自线程内
不可变对象: final关键字;
ThreadLocal: 每个线程有自己的副本
cas原子类: (乐观锁)比较置换, Atomic为前缀的类
有锁:
synchronized关键字: (悲观锁)
ReentrantLock可重入锁: (悲观锁)
3. CopyOnWriteArrayList 等效不可变对象
弱一致性: 写元素时会复制一份数据,与读时不是同一个数组
写时复制
适用场景:读多写少,eg:数据库驱动DriverManager()
4. 线程运行生命周期
NEW:初始化状态
创建线程:继承Thread类 或 实现Runnable接口
RUNNABLE:可运行/运行状态
READY就绪:
1、调用start()方法进入就绪状态
2.当线程sleep()方法结束,其它线程join()结束,某个线程拿到对象锁这些线程也将进入就绪状态
3、当前线程时间片用完,调用yield()方法,进入就绪状态
RUNNING运行中:
线程调度程序从可运行池中选择一个线程作为当前线程,此时线程所处的状态为运行中。线程进入运行状态的唯一方式。
BLOCKED:阻塞状态
阻塞在synchronized关键字修饰的方法或代码块。
WAITING:等待状态,无时限
调用sleep或wait方法后出于waiting状态,等待被唤醒。
TIMED_WAITING:超时等待,有时限
调用sleep或wait方法后出于waiting状态,等待被唤醒,或超时自动唤醒
TERMINATED:终止状态
当线程的run()方法完成时,或主线程的main()方法完成是,我们认为它终止了。也许是活的但已经不是一个单独执行的线程,不可复生。
interrupt():强制中断run()方法
1. 死锁:
两个或两个以上线程互相持有对方所需要的资源,循环等待
互斥
占有等待: 一次性申请所有资源
不可抢占: 进一步申请资源时,如果申请不到过一段时间主动释放其占有的资源
循环等待: 按次序申请,资源线性化
2. Guarded Suspension: 保护性暂挂-通知模式 notifyAll();
3. BlockingQueue常用的操作包括 add(队列满抛异常),offer(队列满返回失败),put,remove,poll,take,peek。
4.二阶段终止模式: BlockingQueue
<1> 发出信号,告知正在运行的线程将被终止 volatile
<2> 接收到此信号的线程,做完善后工作,停止运行。
5.线程池:
核心线程、非核心线程: keepAliveTime(没有被分配任务的时长)
线程池源码:
shutdownNow():
checkShutdownAccess(): 安全检查机制
advanceRunState(STOP): 将线程池状态变为STOP,本质是线程标记位的改变
interruptWorkers(): 对线程池内所有线程进行中止操作
tasks=drainQueue():
判断空闲线程:runWorker执行task的run方法时会加一把锁,如果获取所成功了,说明没有task的run方法在执行,这个就属于空闲线程
shutdown():方法执行后,就会拒绝接收新的任务,但是会等待线程池中正在执行的任务和已经进入阻塞队列的任务都执行完之后,才最终关闭线程池。
shutdownNow方法就比较暴力了,线程池,阻塞队列里的任务通通不允许再执行了,不过会返回阻塞队列中没执行完的任务。
- Promise模式: 异步编程模式 FutureTask有返回结果的线程
Promisor: create()方法返回 Promise
Executor: 在Promisor.create()方法中执行异步
Promise : get()方法是阻塞的
Result: Promise.get()的返回值
构建Promisor? futureTask=new FutureTask<>(()->{sss}); new Thread(futureTask).start(); return futureTask;
FutureTask: 实现了RunnableFuture接口。RunnableFuture分别继承了Runnable接口和Future接口。
7.线程池
EXecutor: execute()提交线程任务
ExecutorService: Executor的子接口
Executors: 线程池的辅助工具类 以通过Executors来快捷的创建你需要的线程池
ThreadPoolExecutor: ExecutorService的实现类
corePoolSize:线程池里的核心线程数量
maximumPoolSize:线程池里允许有的最大线程数量
keepAliveTime: 设置空闲线程等待时间
unit:这个是上面那个keepAliveTime的单位
workQueue: 阻塞队列
ArrayBlockingQueue: 基于数组 有界
LinkedBlockingQueue:基于链表 无界
SynchronousQueue: 只有一个元素 同步
PriorityBlockingQueue: 优先级
threadFactory: 创建新的线程放入线程池的时候,就是通过这个线程工厂来创建
handler:四种拒绝策略
AbortPolicy: 抛异常,阻止任务执行
DiscardPolicy: 默默丢弃
DiscardOldestPolicy: 默默丢弃最老的任务
CallerRunsPolicy: 在提交任务的用户线程中运行当前任务
8.Active Object模式 主动对象模式
9.Executors框架提供的线程池:
newSingleThreadExecutor(): 只有一个工作线程 + 队列
newCachedThreadPool(): 线程数量是可变的
newFixedThreadPool(): 带固定数量线程的线程池
newSingleThreadScheduledExecutor(): 返回ScheduledExecutorService对象实例,实际上是继承了接口ExecutorService,并扩展出了周期性调度任务的能力
newScheduledThreadPool(): 同上,能够指定线程的数量
10.生产中自定义线程池
corePoolSize为N(CPU个数)+1
maximumPoolSize设置为N(CPU个数)*2
自定义线程工厂
自定义拒绝策略,只需要实现RejectedExecutionHandler接口