Java并发相关知识
进程、线程
进程:进程是程序运行的基本单位,进程是一个程序从创建到运行到消亡的过程
线程:线程是比进程更小的运行单位,线程共享进程的堆和方法区,每个进程有单独的虚拟机栈、程序计数器和方法栈
如何创建线程
new Thread( ).start( )
线程的生命周期和状态
初始状态:线程被new出来 还没有start线程
运行状态:分为就绪状态和运行状态
等待状态:等待其他线程的动作才继续运行
超时等待状态:一定的时间后回到运行状态 或者其他线程唤醒
阻塞状态:等待锁的释放
终止状态:程序运行完成
什么是上下文切换,什么时候会有
上下文切换就是cpu从一个线程转换到另一个线程,将原线程的上下文记录下来,并读取新线程的上下文
1.主动让出cpu sleep,wait等
2.时间片用完 防止其他线程饿死,切换进程
3.发生阻塞的时候
4.被终止或者运行完毕
sleep和wait的区别
sleep是不释放锁的,用于暂停执行 ,是Thread下的方法,是能主动苏醒的
wait是释放锁的,用于线程通信、交互,是Object下的方法,带参数的可以主动苏醒,不带参数的需要其他线程唤醒
为什么wait方法在Object中?
因为wait方法是要释放锁的,释放的是对象锁,就是object下的对象,sleep是不用的因此在object下
死锁
什么是线程死锁
线程死锁就是一个或者多个线程想要获取某个资源,但是这个资源被占用着并迟迟得不到释放这就是线程死锁
线程死锁的条件
线程死锁的条件:
互斥条件
循环等待条件
请求和保持条件
不可剥夺条件
如何检测死锁
jmap,jstack
预防和解决死锁的方法
一次性向所有资源发出请求
请求不到志愿时,要释放自己手头的资源
按照一定的顺序去获取资源