JAVA并发编程(三)-资源争用和调度

Scroll Down

JAVA并发编程(三)-资源争用和调度

资源争用和调度

由于资源的稀缺性或者资源本身的特性,多个线程间需要共享同一个资源,在一个线程占用排他性资源进行访问而未释放对源所有权的时候,其他线程视图访问该资源的现象称为资源争用,但是多个运行状态的线程我们称为高并发,高并发虽然会增加高争用的概率,但是不一定意味着高争用.

多个线程共享一个资源时会带来资源调度问题,多个线程申请同一个排他性资源的情况下,决定哪个线程会被授予该资源的独占权,即选择哪个申请者占用该资源的过程称为资源调度,获得资源的独占权而未释放其独占权的线程称为该资源的独占线程,资源调度策略的一个常见特性就是它能否保证公平性.

公平性是指资源的申请者(线程)能否按照申请资源的顺序而授予资源的独占权,如果可以则称为公平的,如果资源的后申请者可以比先申请者更早获得资源的独占权,则称为非公平的资源调度策略.

资源调度一种常见的策略就是调度,资源调度器内部维护一个等待队列,在存在资源争用的情况下,未获得资源的独占权的资源申请者会被存入该队列,被存入的队列通常会暂停,当相应的资源被释放时,等待队列中的一个线程会被选中并被唤醒而获得再次申请资源的机会,如果被唤醒的线程获得资源的独占权,那么该线程会从等待队列中移除.否则,该线程仍然会停留在等待队列中等待再次申请的机会,即该线程会再次被暂停.因此,一个等待队列中的线程可能经历若干次暂停与唤醒才能获得相应资源的独占权.资源的调度会导致上下文切换.公平的调度策略不允许插队现象的出现,只有在资源未被其他线程占用并且等待队列为空时,申请者才被允许抢占相应资源的独占权。其中,抢占成功的申请者获得资源独占权,抢占失败的申请者进入等待队列。因此,公平的调度策略的资源申请者总是按照先来后到的顺序来获得资源的独占权。而非公平调度策略则允许插队现象,一个线程释放资源独占权时,等待线程中的一个线程会被唤醒再次申请相应的资源,而在这个过程中另外一个申请该资源的活跃线程可以与这个被唤醒的线程共同参与相应资源的抢占。因此,非公平调度策略中被唤醒的线程不一定就能成功申请到资源,在极端的情况下非公平调度策略可能会导致等待队列中的线程永远无法获得其所需资源,即出现饥饿现象,而公平调度策略则可以避免该问题。

策略优点缺点
公平策略申请者获得相应资源的独占权所需时间的偏差比较小吞吐率较低
非公平策略吞吐率较高申请者获得相应资源的独占权的时间偏差大
并可能导致饥饿现象

在资源的持有线程释放到新线程被唤醒到运行时需要一个时间,在该时间段内,非公平调度策略可以先获得资源的独占权。如果该线程所需资源时间较短,有可能在被唤醒的线程运行前完成对资源的释放,可以减少上下文切换的次数。到那时如果多数线程占用资源时间较长,那么非公平调度策略可能会导致增加上下文切换。因此,多数情况下我们默认使用非公平调度策略,只有在资源持有线程占用时间长或者对时间偏差有所需求的时候,我们才会考虑使用公平调度策略。

总结

image-20200313004500166