Java线程上下文切换开销大小与线程数量的关系?

发布于 2022-09-06 01:02:04 字数 342 浏览 11 评论 0

在《Java并发编程的艺术》这本书的1.1.4章节"减少上下文切换实战"中举了一个例子,起初dump jboss进程时发现有300+个worker线程处于 waiting 状态,然后通过减少线程池的线程最大数量来减少处于 waiting 状态的线程数量,意思是这样就能减少上下文切换的次数了。

但是我有一点不太明白,如果大量线程处于 waiting 状态而请求数又少的话,那么OS从300个waiting线程中选一个处理请求跟从100个 waiting 线程中选一个不都是只有1次上下文切换吗;如果新到10个请求,那么无论你处于 waiting 的线程有多少,进行上下文切换的也只有个10个线程吧,线程数量多增加的是内存占用,跟调度开销有什么直接关系吗

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

眼眸里的那抹悲凉 2022-09-13 01:02:04

这个要看代码怎么写的了,看下面代码:

Integer[] array = new Integer[0];

public synchronized void addElement(Integer i) {
    while(array[0] != null) {
      this.wait();
    }
    array[0] = i;
}

public synchronized void removeElement() {
    while(array[0] == null) {
      this.wait();
    }
    array[0] = null;
    this.notifyAll();
}

假设执行顺序这样的:

  1. 线程1,addElement,成功
  2. 线程2~101,addElement,waiting
  3. 线程102,removeElement,成功
  4. 线程2~101,会逐一变成runnable,但是只有一个能够成功,另外99个又会变成waiting

每一次从waiting到runnable都是一次context switch,从runnable 到 waiting也会产生context switch。在这个例子里,一共发生了100+99次。如果要想把线程2~101全部都执行完毕,那么就要产生100+99+...+2+1次context switch。

做个少女永远怀春 2022-09-13 01:02:04

原因很简单,因为操作系统需要对线程进行维护的(而不论这个线程出于什么样的状态)

所以线程越多,操作系统的开销确实是越大的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文