我试图深入同步。
here,其中提到“每个对象都有与之关联的内在锁定”。
我理解Object类。它(我们很熟悉)没有任何像锁的属性(因此我猜它叫内在锁)。这个锁究竟是什么(即它是一个Lock.java类?它是某种隐藏的字段?)以及它是如何与一个对象相关联的(即有一些神秘的隐含引用来自对象的锁定,本机发生的事情)?
When several threads try to acquire the same lock, one or more threads will be suspended and they will be resumed later.
这些线程存储在哪里?什么数据结构保存等待线程的记录?
当等待很多人时,使用什么逻辑来挑选等待进入同步方法的线程?
从“synchronized keyword”到“内部锁定获取”的所有内容(逐步)的提法?
允许等待同步的线程数是否有上限?
答案 0 :(得分:2)
1)是的,锁实际上是对象上的隐藏字段。除非通过同步,否则无法访问它。
2)等待线程基本上只是睡眠,直到锁定可用。它们不是“存储”在任何特殊位置,也没有可见的等待线程队列。隐藏了实施细节。
3)我认为没有任何承诺的订单。如果您明确需要循环调度或优先级或类似的东西,那么您有责任在同步锁机制之上实现它(或使用为您实现它的类)。
4)如果您了解这些信号量,可能会将其作为操作系统信号量处理。如果你不这样做,那么定义它们会让我觉得太多细节需要在这里正确处理......除非你重新实现它,否则你真的不需要理解它。
5)据我所知,没有明确的限制。 (我没有检查过官方的Java规范,但是我理解这种东西是如何在操作系统级别实现的。)当然,在某些时候你会耗尽系统资源,但我认为你通常会首先耗尽其他资源(比如内存来运行这些线程)。
另外一个注意事项:值得查看Atomic
...类。当这些可以使用时,它们在现代处理器中比传统的Java同步更有效。