线程生命周期

线程创建方式:
继承Thread
实现Runable接口
实现Callable 接口
线程池

java 中每次程序运行至少启动2个线程,
一个是main线程,一个是gc垃圾回收线程

线程生命周期:
新建–就绪------------运行—死亡
– 阻塞–

新建:new 创建一个线程后,该线程就处于新建状态
jvm 为线程分配内存,初始化成员变量

就绪:start() 方法后,该线程就处于就绪态
jvm 线程创建方法栈和程序计数器,等待线程调度器调度

运行:
就绪状态获取cpu资源,开始运行run()状态
阻塞:
线程调用sleep方法放弃cpu
调用了阻塞式IO方法,该方法返回之前,线程被阻塞
线程试图获取一个同步锁,该同步锁正在被其他线程锁持有
线程在等待某个通知 notify
程序调用了线程的suspend()方法将线程挂起,容器导致死锁

死亡:
run()或call()方法执行完成,线程正常结束
线程抛出一个为捕获的Exeception或Error
调用线程的stop()方法结束线程,容器导致死锁

线程安全问题:

多个线程操作共享的数据
操作共享数据代码有多行
多数据有写操作

解决线程安全问题: --线程同步
1、同步代码块 (synchroniezd)
2、同步方法 (synchroniezd)
3、同步锁 (ReenreandLock)
4、特殊域变量 volatile
5、局部变量 ThreadLocal
6、阻塞队列 LinkedBlock
7、原子变量 (Atomic*)

synchronized
变量:锁住的是对象
作用在方法:同步锁是当前类的实例对象
作用在static方法:锁的是当前类的class

ReenreantLock (同步锁)
公平锁
private Lock lock = new ReentrantLock(true); 多个线程轮询使用cpu资源
非公平锁

synchronized 和 Lock 区别
synchronized 是java内置类,lock是个java类
synchronized 会自动释放锁,lock可以判断是否获取到锁
sychronized 当线程阻塞时,会一直等待,lock不一定会等待
sychronized 锁时可重入、不可中断、非公平,而lock的锁时可冲入、可判断、可公平的锁
lock 适合大量同步代码的同步问题,synchronized 适合代码少量的同步问题。

线程死锁:
多个线程竞争资源而造成的一种僵局(互相等待)

死锁产生的条件:
互斥条件:进程要求对所分配的资源进行排他性控制,在一段时间内某个资源为一个进程所占有,
不可剥夺条件:进程所获得的资源在使用完成之前,不能被其他进程强行剥夺,只能由该资源进程来自己释放
请求与保持条件:进程已经保持了一个资源,但又提出了另一个资源,而该资源被其他进程占有,此时请求进程被阻塞,但又不释放自己的资源。
循环等待条件:多个线程循环等待

死锁处理:
预防死锁:通过设置某些限制条件,去破坏产生死锁的四个条件中的一个
避免死锁:在资源动态分配过程中,用某种方法防止系统进入不安全状态,避免死锁的发生
检测死锁:允许系统运行过程中发生死锁,可设置检测机制及时检测死锁的发生,并采取适当的措施加以清除
解除死锁:检测出死锁后,采取适当的措施将进程从死锁状态中解脱处理。

破坏互斥条件:互斥条件无法破坏

死锁避免:

有序资源分配法:
必须知道要申请哪些资源
必须为所有资源统一编号,1 2 3
同类资源必须一次申请完,
不同类型必须按顺序申请

银行家算法:
开始
request << need
request << savelable

顺序加锁
threadA lock : A B C
threadB lock : A B C
避免了循环锁

限时加锁:
线程获取锁的时候增加一个超时时间,时间过了就摒弃

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值