多线程

作者:加菲猫 2019-02-19 60 0

线程状态

就绪(Runnable):线程准备运行。
运行中(Running):线程正在被执行。
等待中(Waiting):线程被阻塞。
睡眠中(Sleeping):线程处于睡眠状态。
I/O 阻塞(Blocked on I/O):等待 I/O 操作完成。
同步阻塞(Blocked on Synchronization):等待获取锁。
死亡(Dead):线程执行完毕。

线程池

在初始化应用时创建,执行任务时重用线程,而不是创建新的线程,减少了应用的响应时间。
开启多个任务时,不用为每个线程设置属性。
可以设置最大线程数量。

悲观锁、乐观锁

悲观锁 乐观锁
只有一个线程执行,其它线程等待 各线程同时执行,更新数据时才检查版本号
开始事务 → 查询库存 → 生成订单 → 修改库存 → 提交事务 查询库存 → 生成订单 → 检查版本号 → 修改库存

死锁

多个线程互相持有对方需要的资源,都处于等待状态,无法继续执行。

产生原因:

  • 资源只能被一个线程占用。
  • 线程因为请求不到资源被阻塞后,不释放已有的资源。
  • 资源被线程占用后,除非该线程被释放,否则其它线程不可占用。

避免方法:

  • 确保所有的线程都按相同顺序加锁。
  • 如果一个线程在规定时间内无法获得所需的全部资源,则退回所有资源,等待随机时间后重试。
  • 前两种方法不能确保避免死锁,可在线程请求与获得锁时写入数据库,进行死锁检测。

wait() 和 sleep()

wait() sleep()
Object Thread
释放对象锁 不释放对象锁
需要用 notify() 唤醒 暂停指定的时间后,会自动恢复

notify() 和 notifyAll()

notify() notifyAll()
通知等待这个对象锁的所有线程 通知一个线程

BIO、NIO、AIO

BIO NIO AIO
同步、阻塞 同步、非阻塞 异步、非阻塞
每个连接一个线程 每个请求一个线程 每个有效请求一个线程

连接数少且架构固定的项目用 BIO,连接数多且连接短的项目用 NIO(聊天),连接数多且连接长的项目用 AIO(相册)。

发表评论

下一篇: 上一篇: