【问题标题】:when case switch between kernel mode and user mode for synchronized keyword in JAVAJAVA中同步关键字在内核模式和用户模式之间切换的情况
【发布时间】:2020-01-06 03:15:58
【问题描述】:

当JAVA中的synchronized关键字使用互斥锁时,如果只有一个线程争抢锁,还是会导致内核态和用户态的切换?

内核模式和用户模式之间的切换不仅发生在线程被通知或阻塞时,它还发生在发生锁争用时?

其实我想知道轻量级锁和偏置锁是如何提高同步关键字性能的

【问题讨论】:

  • 你能用更容易理解的句子结构吗?另外,我相信人们会想要一些示例代码来解决您的问题。
  • 内核模式是什么意思?
  • 如果他的线程已经持有锁,那么只有一个计数器增量。否则锁还是要上锁的。

标签: java mutex


【解决方案1】:

让我们先整理一下您的术语。如果一个线程试图获取一个互斥锁并且该互斥锁当前没有被另一个线程持有,那么就没有争用。只有在涉及两个或更多线程时才会发生争用。

(我还假设“内核模式”意味着您正在切换到操作系统内核使用的特权指令模式和/或重新加载虚拟内存上下文,以便 CPU 可以访问内核数据结构。精确的细节不是相关...)

以下是案例:

  1. 无争用:当没有其他线程持有该线程时,一个线程尝试获取该线程。在这种情况下,无需切换到内核模式即可获取互斥锁。

    这包括线程尝试获取它已经拥有的互斥锁的子情况。这不是争论。

  2. 争用:当其他线程持有一个线程时,一个线程试图获取它。在这种情况下,有两种可能。

    • 如果使用自旋锁,则尝试获取线程的线程可能轮询锁定字一段时间以尝试获取它。如果成功,则没有用户模式 ​​-> 内核模式切换。

    • 如果不使用自旋锁(或者如果自旋时间过长),则线程切换到内核模式,以便可以将当前线程置于暂停状态,并由操作系统调度另一个线程。

【讨论】:

  • 根据你提到的案例1,偏置锁如何提高同步关键字的性能
  • 这是一个不同的问题。您可以在其他问答中阅读有关偏向锁定的信息。或在此 Oracle 帖子中:blogs.oracle.com/dave/biased-locking-in-hotspot。 (短版,偏向锁尽量避免使用CAS指令。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2013-10-04
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多