自旋锁和JVM对锁的优化,有哪些巧妙之处?

2026-04-01 06:280阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2996个文字,预计阅读时间需要12分钟。

自旋锁和JVM对锁的优化,有哪些巧妙之处?

背景+上图+由此可见,非自旋锁如拿不到锁会把线程阻塞直到被唤醒;自旋锁拿不到锁会直接尝试,为什么这样?好处+阻塞和唤醒线程都是需要较高开销的,自旋锁可以避免这种开销;同步和唤醒线程都需高效的开销,如果同步代码块执行时间较长,同步代码块会占用大量CPU资源。

背景

先上图

由此可见,非自旋锁如果拿不到锁会把线程阻塞,直到被唤醒;自旋锁拿不到锁会一直尝试

为什么要这样?

好处

阻塞和唤醒线程都是需要高昂的开销的,如果同步代码块中的内容不复杂,那么可能转换线程带来的开销比实际业务代码执行的开销还要大。

在很多场景下,可能我们的同步代码块的内容并不多,所以需要的执行时间也很短,如果我们仅仅为了这点时间就去切换线程状态,那么其实不如让线程不切换状态,而是让它自旋地尝试获取锁,等待其他线程释放锁,有时我只需要稍等一下,就可以避免上下文切换等开销,提高了效率。

用一句话总结自旋锁的好处,那就是自旋锁用循环去不停地尝试获取锁,让线程始终处于 Runnable 状态,节省了线程状态切换带来的开销。

阅读全文

本文共计2996个文字,预计阅读时间需要12分钟。

自旋锁和JVM对锁的优化,有哪些巧妙之处?

背景+上图+由此可见,非自旋锁如拿不到锁会把线程阻塞直到被唤醒;自旋锁拿不到锁会直接尝试,为什么这样?好处+阻塞和唤醒线程都是需要较高开销的,自旋锁可以避免这种开销;同步和唤醒线程都需高效的开销,如果同步代码块执行时间较长,同步代码块会占用大量CPU资源。

背景

先上图

由此可见,非自旋锁如果拿不到锁会把线程阻塞,直到被唤醒;自旋锁拿不到锁会一直尝试

为什么要这样?

好处

阻塞和唤醒线程都是需要高昂的开销的,如果同步代码块中的内容不复杂,那么可能转换线程带来的开销比实际业务代码执行的开销还要大。

在很多场景下,可能我们的同步代码块的内容并不多,所以需要的执行时间也很短,如果我们仅仅为了这点时间就去切换线程状态,那么其实不如让线程不切换状态,而是让它自旋地尝试获取锁,等待其他线程释放锁,有时我只需要稍等一下,就可以避免上下文切换等开销,提高了效率。

用一句话总结自旋锁的好处,那就是自旋锁用循环去不停地尝试获取锁,让线程始终处于 Runnable 状态,节省了线程状态切换带来的开销。

阅读全文