我试图深入同步。
here ,它提到“每个对象都有一个与其关联的内在锁。”。
我了解对象类。它(我们众所周知)没有任何像锁一样的属性(因此我猜它被称为内在锁)。这个锁到底是什么(即它是 Lock.java 类吗?它是某种隐藏字段?)以及它如何与对象关联(即是否存在从对象对锁的一些神秘隐式引用, native 发生的事情)?
当多个线程尝试获取相同的锁时,一个或多个线程将被挂起,稍后它们将被恢复。
那么这些线程存储在哪里?什么数据结构保存等待线程的记录?当有很多等待线程时,幕后使用什么逻辑来选择等待进入同步方法的线程?
有没有引用从“同步关键字”到“内在锁获取”的幕后发生的事情(一步一步)?
允许等待同步的线程数量是否有上限?
最佳答案
1) 是的,锁本质上是对象上的一个隐藏字段。除非通过同步,否则您无法访问它。
2) 等待线程本质上只是 hibernate ,直到锁可用为止。它们没有“存储”在任何特殊的地方,也没有可见的等待线程队列。实现细节被隐藏。
3) 我认为没有任何 promise 的订单。如果您明确需要循环调度或优先级或类似的东西,那么您有责任在同步锁机制之上实现它(或使用为您实现它的类)。
4) 如果您了解这些,这可能会被作为操作系统信号量进行处理。如果您不这样做,那么在我看来,定义它们的细节太多,无法在此处正确处理……除非您重新实现它,否则您实际上不需要理解这一点。
5)据我所知,没有明确的限制。 (我还没有检查过官方的 Java 规范,但我了解这种事情是如何在操作系统级别实现的。)当然,在某些时候你会耗尽系统资源,但我认为你通常会首先耗尽其他资源(例如运行这些线程的内存)。
一个附加说明:Atomic
... 类也值得一看。当这些可以使用时,它们在现代处理器中将比传统的 Java 同步更有效。
关于java - 隐蔽同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22469172/