资源的调度:
多个线程申请同一个排他资源时, 选择哪个线程.
排他性资源,不止是cpu, 还可以是数据库,文件等
常见特性有公平性
公平性
是否按其申请的先后顺序给独占权. 如果任何先来的都先得, 就是公平
不保证都如此, 就是非公平
排队
调度的常见策略.
资源调度器内部维护一个等待队列放暂停(BLOCKED)中的线程
资源空出来的时候, 队列中的队首的线程会被唤醒. 再次申请
如果申请不到(非公平才会出现,如果是公平的,一定就申请到了),再暂停入队
公平
不允许插队,新来的一律入队
队列空的时候,才靠抢,
显示锁可以公平
适用
- 需要 线程等待的时间差别小
- 占用资源时间长的
如果占用时间长,还允许插队, 没有任何好处,反而轮到的线程一次次被暂停唤醒, 多浪费了上下文切换 - 没啥竞争的
因此, 需要这些的时候, 才使用显示锁
轮到的线程 和 新来的线程 2个线程完成代价 最好最差的情况都是:
新到的线程 暂停一次 唤醒一次
轮到的线程唤醒一次
非公平
一般选这个
一般吞吐量大
内部锁是非公平: 每个内部锁有个 Entry Set 用于记录等待的线程, 就是他的队列, 但是这里等待时间最长的线程不一定就下一个被唤醒,Java规范没这么规定, 具体怎么样看具体实现
显示锁,公平非公平都可以, 默认也是非公平
定义: 唤起队中轮到的线程时, 有线程到了, 新到的线程和唤醒的线程竞争
缺点
- 等的时间差别大, 有的会唤醒好几次都抢不到
- 存在队列中的等待线程永远抢不到的可能性(饿死)
适用情况 : 线程们占用资源的时间短的
非公平 最好的情况:
轮到的线程在唤醒, 在它醒来之前, 新到的插队线程已经使用完了资源
不是让新来的线程直接暂停 去排队, 节约了新来线程的上下文切换时间(暂停唤醒)
轮到的线程和新来的线程 2个线程完成代价: 轮到的线程唤醒一次
非公平 最差的情况:
新到的线程抢到了,占了好久, 轮到的线程不得不 再次暂停入队等机会
轮到的线程和新来的线程 2个线程完成代价:
轮到的线程至少唤醒2次,暂停一次, 还不一定能做完.就是一定比公平的吞吐量还差(没节约到新来线程的上下文切换时间),
非公平的好处根本没有,
缺点(不公平)都占了
网友评论