java - 隐蔽同步

标签 java synchronization

我试图深入同步。

here ,它提到“每个对象都有一个与其关联的内在锁。”。

  1. 我了解对象类。它(我们众所周知)没有任何像锁一样的属性(因此我猜它被称为内在锁)。这个锁到底是什么(即它是 Lock.java 类吗?它是某种隐藏字段?)以及它如何与对象关联(即是否存在从对象对锁的一些神秘隐式引用, native 发生的事情)?

  2. 当多个线程尝试获取相同的锁时,一个或多个线程将被挂起,稍后它们将被恢复。那么这些线程存储在哪里?什么数据结构保存等待线程的记录?

  3. 当有很多等待线程时,幕后使用什么逻辑来选择等待进入同步方法的线程?

  4. 有没有引用从“同步关键字”到“内在锁获取”的幕后发生的事情(一步一步)?

  5. 允许等待同步的线程数量是否有上限?

最佳答案

1) 是的,锁本质上是对象上的一个隐藏字段。除非通过同步,否则您无法访问它。

2) 等待线程本质上只是 hibernate ,直到锁可用为止。它们没有“存储”在任何特殊的地方,也没有可见的等待线程队列。实现细节被隐藏。

3) 我认为没有任何 promise 的订单。如果您明确需要循环调度或优先级或类似的东西,那么您有责任在同步锁机制之上实现它(或使用为您实现它的类)。

4) 如果您了解这些,这可能会被作为操作系统信号量进行处理。如果您不这样做,那么在我看来,定义它们的细节太多,无法在此处正确处理……除非您重新实现它,否则您实际上不需要理解这一点。

5)据我所知,没有明确的限制。 (我还没有检查过官方的 Java 规范,但我了解这种事情是如何在操作系统级别实现的。)当然,在某些时候你会耗尽系统资源,但我认为你通常会首先耗尽其他资源(例如运行这些线程的内存)。

一个附加说明:Atomic... 类也值得一看。当这些可以使用时,它们在现代处理器中将比传统的 Java 同步更有效。

关于java - 隐蔽同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22469172/

相关文章:

java - Hibernate session 和垃圾收集器

java - 重新排列代码以获得所需的方 block 输出?

java - 将项目从 JDK 1.7 切换到 1.6 BufferedReader

阶段终止后的 java.util.concurrent.Phaser 回调

android - 同步两个 GLSurfaceViews

java - API 调用中的 HTML 实体编码不正确

java - 修改Netty ServerBootstrap ChannelInitializer

javascript - 将检索数据从 indexedDB 存储到变量

java - 为什么当我使用 'synchronized' 时我的线程没有一个接一个地执行?

sharepoint-2010 - Sharepoint Workspace 2010 本地商店位置