56. synchronized:什么是自旋?
发布日期:2021-05-12 23:59:25 浏览次数:19 分类:精选文章

本文共 489 字,大约阅读时间需要 1 分钟。

在进行Java多线程编程时,特别是处理synchronized锁的代码块,优化等待线程的方式至关重要。对于那些仅执行极短时间内的代码的synchronized块,简单地让等待的线程直接阻塞可能并不是最佳选择。这是因为每次等待时都会强制将线程切换至内核态(kernel mode),这样会引起不少问题。用户态(user mode)和内核态的切换确实需要一定的上下文切换开销,而这种开销在锁保护力的度比较松的情况下,可能显得有些过分。

为了更好地解决这一问题,可以采取自旋(spin)技术。在获得锁之前,让等待的线程在用户态进行忙循环。这样可以减少内核态切换的开销。通常,我们会设置一个自旋次数限制,避免过度自旋导致的性能问题。如果是多次自旋都无法获得锁,那么再次进入阻塞状态是更优的选择。这种混合方式既节省了内核态切换带来的开销,又能提高吞吐量。

这种优化方法尤其适用于那些对锁保护需求并不严格时期,锁的使用不会因长时间等待而导致资源浪费的情况。需要注意的是,自旋次数设置需要根据具体情况进行权衡。适当让线程在用户态进行自旋,可以有效减少等待队列上的线程数目带来的内核态切换开销。

上一篇:57. 线程 B 怎么知道线程 A 修改了变量?
下一篇:55. Thead 类中 yield 方法有什么作用?

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月22日 01时47分31秒