Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';I直接访问(并锁定)对象用于同步块的隐式锁_Java_Synchronization_Locking_Blocking_Synchronized - Fatal编程技术网

Java 为什么可以';I直接访问(并锁定)对象用于同步块的隐式锁

Java 为什么可以';I直接访问(并锁定)对象用于同步块的隐式锁,java,synchronization,locking,blocking,synchronized,Java,Synchronization,Locking,Blocking,Synchronized,为了清楚起见,重新措辞 我希望能够在适当的时候通过直接调用lock和release方法,将synchronized块的使用与更显式的锁定结合起来。因此,我可以在不受影响的情况下使用sychtronized(myObject),但也可以在同步块不够灵活而无法完成所需操作的情况下,直接调用myObject.lock&myObject.unlock 我知道每个对象都隐式地内置了一个rentrant锁,供同步块使用。实际上,每次进入同步块时,对象内部可重入锁上的锁定方法都会被缩放,而当您离开同步块时,会

为了清楚起见,重新措辞

我希望能够在适当的时候通过直接调用lock和release方法,将synchronized块的使用与更显式的锁定结合起来。因此,我可以在不受影响的情况下使用sychtronized(myObject),但也可以在同步块不够灵活而无法完成所需操作的情况下,直接调用myObject.lock&myObject.unlock

我知道每个对象都隐式地内置了一个rentrant锁,供同步块使用。实际上,每次进入同步块时,对象内部可重入锁上的锁定方法都会被缩放,而当您离开同步块时,会在同一重入锁上调用解锁。我似乎很容易让人能够手动锁定/解锁这个非法的可重入锁;因此,允许混合使用同步块和显式锁定

然而,据我所知,没有办法做到这一点。由于同步块的工作方式,我不认为有一种方便的方法可以将它们与显式锁定或其他方式混合使用。通过扩展对象api来添加锁定/解锁方法,似乎这将是一个非常方便且易于添加的方法


我的问题是,为什么这不存在?我肯定有原因,但我不知道是什么原因。我认为问题可能在于封装;同样的原因,你不想做同步(这)。然而,如果我已经在调用synchronized(myObject),那么通过定义,任何了解myObject的人都可以在其上进行同步,如果做得愚蠢,就会导致死锁。封装的问题归结为谁可以访问同步对象,而不管您使用的是同步块还是手动锁定对象;至少在我看来是这样。因此,不允许手动锁定对象还有其他好处吗?

某个对象的锁定与实例本身紧密相关。
同步的
块和方法的结构非常严格。作为程序员,如果您有可能干扰系统(虚拟机),则可能会导致严重问题

  • 您最终可以释放由
    同步的
    块创建的锁
  • 您创建了一个锁,另一个
    同步的
    块将释放该锁
  • 创建的锁条目多于出口
  • 您创建的锁出口比入口多
甚至还有为
锁定
释放
操作定义的特定字节码。如果您想为这个锁定/解锁操作提供一个“方法”,那么应该将它编译成这些字节码。因此,它实际上是一个低级操作,与其他Java对象级实现非常不同

同步是一个非常强大的契约。我认为JLS的设计人员不希望有可能破坏这项合同


描述了有关预期行为的更多信息。

某个对象的锁与实例本身密切相关。
同步的
块和方法的结构非常严格。作为程序员,如果您有可能干扰系统(虚拟机),则可能会导致严重问题

  • 您最终可以释放由
    同步的
    块创建的锁
  • 您创建了一个锁,另一个
    同步的
    块将释放该锁
  • 创建的锁条目多于出口
  • 您创建的锁出口比入口多
甚至还有为
锁定
释放
操作定义的特定字节码。如果您想为这个锁定/解锁操作提供一个“方法”,那么应该将它编译成这些字节码。因此,它实际上是一个低级操作,与其他Java对象级实现非常不同

同步是一个非常强大的契约。我认为JLS的设计人员不希望有可能破坏这项合同


描述了更多有关预期行为的信息。

为了澄清(并防止出现像我现在删除的一个和后面的一个这样的答案),您说您希望在同一个监视器上同步,但不希望使用
synchronize
语句。您希望(有效地)获取某种监视对象,并在其上调用
lock
方法,执行其他逻辑,然后在其上调用
release
。因此,这不是关于同步方法与同步块的问题,而是关于通过显式“锁定”和“释放”调用使用同一个监视器的问题。现在我不确定他想知道什么,最后一段作为高级OO设计主题是有意义的,第一段是线程安全初学者提出的问题;在中间段落里,他谈到了一些被整合的块,他可能是指同步化的方法,或是对这一点进行同步化。有点困惑是的TJ,我在问你说了什么。很抱歉,如果我说得不好,我想不出如何清楚地表达我想要的。这个问题很好,+1,但我担心它很快会以“不是一个真正的问题”结束,因为这个问题没有一个单一的答案。我只是想说清楚(并防止像我现在删除的答案,以及随后的答案),您的意思是希望在同一监视器上同步,但不希望使用
synchronize
语句。您希望(有效地)获取某种监视对象,并在其上调用
lock
方法,执行其他逻辑,然后在其上调用
release
。所以这不是关于同步方法和同步块的问题,而是关于通过显式“锁定”和“释放”调用使用同一个监视器的问题。现在我不确定他想知道什么,最后一段