java - 使用 AtomicInteger 的线程如何减少上下文切换次数?
问题描述
我正在研究 AutomaticInteger。它声明使用 AtomicInteger 使整数运算成为非阻塞的。据说 AtomicInteger 的 compareAndSet() 方法利用了 Compare-and-set 特性。如果不成功,比较并设置功能将返回 false。为了使比较和设置成功,AtomicInteger 的 compareAndSet() 方法必须在无限循环中使用它。据说由于整数运算很小,所以在循环中等待比切换上下文更有好处。
据我了解,每个线程都有可用的固定时间量。如果一个线程不能在它的时间量内完成它的工作,它就必须被抢占。然后它会在以后再次获得机会。
所以我的问题是:
- 在无法获得 Synchronized 方法或块的锁定后,是否有任何线程在其时间量到期之前被抢占?如果是,该线程何时再次获得 CPU 时间?
- AtomicInteger 类的 compareAndSet() 方法中存在的一种自旋锁(无限循环)如何能够减少上下文切换时间?
解决方案
在无法获得 Synchronized 方法或块的锁定后,是否有任何线程在其时间量到期之前被抢占?如果是,该线程何时再次获得 CPU 时间?
这取决于调度程序。但如果线程被抢占,那只是因为有其他线程可以立即向前推进。
AtomicInteger 类的 compareAndSet() 方法中存在的一种自旋锁(无限循环)如何能够减少上下文切换时间?
只有在被修改时才会循环AtomicInteger
,在这种情况下,这意味着另一个线程向前推进。无论如何,两个线程无法通过同时修改相同的共享资源来取得进展。如果它循环很多,这意味着其他线程正在取得很多前进的进展。在现实条件下,线程旋转两次以上的情况非常罕见,而且这仍然比不必要的上下文切换便宜。
推荐阅读
- laravel - 电子商务:我该如何进行跟踪程序?
- angular6 - 没有指令“exportAs”设置为“matAutocompleteOrigin”
- android - 通过片段让 UnityPlayer 保持活力
- sql - Postgresql递归解析嵌套JSON
- window.opener - 如何在 window.open() 方法被触发的同一页面中的 window.open() 方法中获取 url 的响应?
- xml - 在 .vcxproj 中为 Visual Studio 2017 设置目标名称
- wordpress - 具有新文件结构的 wordpress 安装上旧网址的 Htaccess 重定向
- java - Spring Boot Profiles - 运行 sql-script 而不是 ddl-auto
- javascript - 如何使用 window.location.href 从文档中转到 iframe 的内容 div
- apache-nifi - InvokeHTTP 处理器问题