首页 > 解决方案 > 使用 AtomicInteger 的线程如何减少上下文切换次数?

问题描述

我正在研究 AutomaticInteger。它声明使用 AtomicInteger 使整数运算成为非阻塞的。据说 AtomicInteger 的 compareAndSet() 方法利用了 Compare-and-set 特性。如果不成功,比较并设置功能将返回 false。为了使比较和设置成功,AtomicInteger 的 compareAndSet() 方法必须在无限循环中使用它。据说由于整数运算很小,所以在循环中等待比切换上下文更有好处。

据我了解,每个线程都有可用的固定时间量。如果一个线程不能在它的时间量内完成它的工作,它就必须被抢占。然后它会在以后再次获得机会。

所以我的问题是:

  1. 在无法获得 Synchronized 方法或块的锁定后,是否有任何线程在其时间量到期之前被抢占?如果是,该线程何时再次获得 CPU 时间?
  2. AtomicInteger 类的 compareAndSet() 方法中存在的一种自旋锁(无限循环)如何能够减少上下文切换时间?

标签: javamultithreadingjava.util.concurrentatomicinteger

解决方案


在无法获得 Synchronized 方法或块的锁定后,是否有任何线程在其时间量到期之前被抢占?如果是,该线程何时再次获得 CPU 时间?

这取决于调度程序。但如果线程被抢占,那只是因为有其他线程可以立即向前推进。

AtomicInteger 类的 compareAndSet() 方法中存在的一种自旋锁(无限循环)如何能够减少上下文切换时间?

只有在被修改时才会循环AtomicInteger,在这种情况下,这意味着另一个线程向前推进。无论如何,两个线程无法通过同时修改相同的共享资源来取得进展。如果它循环很多,这意味着其他线程正在取得很多前进的进展。在现实条件下,线程旋转两次以上的情况非常罕见,而且这仍然比不必要的上下文切换便宜。


推荐阅读