阻塞的线程是否会导致性能损失

本文关键字:性能 损失 是否 线程 | 更新日期: 2023-09-27 18:28:20

我有一个方法需要访问静态数组并进行一些繁重的计算。

public void DoIt(){
  lock(myStaticArray){
    // do crazy stuff
  }
}

该方法需要一到两秒钟才能完成,因此在这里,几纳秒的时间来获取锁定并不重要。

现在假设有10个线程到达代码,其中一个线程已输入。现在,它是否会使线程内运行的代码比没有线程等待锁的情况下慢?等待锁定的被阻塞线程在等待时会占用CPU吗?

阻塞的线程是否会导致性能损失

简单的答案是否定的,由于其他线程在等待锁,对正在运行的线程(做"疯狂事情"的线程)没有明显的CPU影响。

正如评论中所提到的,线程可能会在很短的一段时间内旋转等待("繁忙等待",即它们使用CPU时间),这将占用非常微不足道的CPU时间,然后它们将进入等待状态,这意味着它们将不会在CPU上调度,直到它们正在等待的对象发出信号(意味着正在工作的线程离开锁)。