【问题标题】:What will happen if the locks themselves get contended upon?如果锁本身被争用会发生什么?
【发布时间】:2014-01-16 23:28:36
【问题描述】:

Java 中的所有对象都有内在锁,这些锁用于同步。这个概念可以防止对象同时被不同的线程操作,或者帮助控制特定代码块的执行。

如果锁本身被争用会发生什么 - 即 2 个线程在精确的微秒内请求锁。

谁得到它,它是如何解决的?

【问题讨论】:

  • 你是从哪里得到intrinsic locks这个概念的?
  • 如果 2 个线程想要在精确的“纳秒”内获得相同的锁,那么首先请求/请求它的线程将获得它......前提是其他一些线程没有持有它......跨度>
  • @Craig 在 Oracle 站点本身。如果您不熟悉这个概念,请在此处阅读:docs.oracle.com/javase/tutorial/essential/concurrency/…
  • 这里有点宽泛,完整的答案将是关于并发的书中的一章。简短的回答是没有“完全相同的时间”——它是在 CPU 支持下完成的原子操作
  • 我对这个主题很熟悉,只是从未听说过它(主要在 C# 中使用同步)

标签: java multithreading locking


【解决方案1】:

如果锁本身被争用会发生什么 - 即 2 个线程在精确的微秒内请求锁。

一个线程将获得锁,另一个线程将被阻塞,直到第一个线程释放它。

(旁白:其他一些答案断言Java中没有“同时”这样的东西。他们错了!有这样的事情!如果JVM使用两个或更多多核系统的核心,那么不同核心上的两个线程可以完全相同相同的硬件时钟周期中请求相同的对象锁定。显然,只有一个会得到它,但这是一个不同的问题。)

谁得到它,它是如何解决的?

未指定哪个线程将获得锁。

它(通常)由操作系统的线程调度程序解决......使用任何使用的机制。 JVM 行为的这一方面(显然)是特定于平台的。

如果您真的非常想准确了解发生了什么,OpenJDK 和 Linux 的源代码是免费提供的。但坦率地说,你不需要知道

【讨论】:

  • 在多核的同一时钟周期上,在谈论互斥体时,您仍然没有“同时”在内存访问级别(因为如果您这样做了,您会被淹没)。总线仲裁器将确定哪个内核“获胜”并访问内存。这就是我在我的(未回答)评论中所逃避的:)
  • @BrianRoach - 即使有一块硬件在更新单个内存单元时决定哪个内核“获胜”,但事实仍然是两个内核确实达到了同时完成线。这就是>>我
【解决方案2】:

锁不仅在 JVM 中实现,还在操作系统和硬件级别实现,因此机制可能不同。我们依赖 Java API 和 JVM 规范,他们说其中一个线程将获取锁,而另一个线程将阻塞。

【讨论】:

    【解决方案3】:

    事物处理锁请求一次只能处理一件事;因此,2个线程不能同时请求锁。

    即使在同一微秒内,一个仍将领先于另一个(可能快一纳秒)。先问的人会得到锁。第二个请求的人将等待锁被释放。

    打个比方……把纸叠在一起……假设我有一只手,而那只手只能拿着一张纸。不同的人(线程)递给我一张纸。如果两个人“同时向我提供文件”,我会先处理一个

    实际上,没有同时存在的东西。这句话的存在是因为我们的大脑无法以微...纳米...皮秒的速度工作

    http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

    【讨论】:

      【解决方案4】:

      说到并发,没有“同时”这回事; java 确保 someone 是第一个。

      如果您问的是对锁对象的同时竞争访问,这就是并发编程的精髓——除了“这是设计使然”之外,别无他求

      如果您询问同时使用对象作为锁作为常规对象,这不是问题:在并发调用同步的过程中使用非同步方法时,它总是会发生方法(使用this作为锁定对象)

      【讨论】:

        猜你喜欢
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多