我在这网页上读到了关于代表和事件的文章,以更好地了解它们之间的关系。在阅读时,我偶然发现了这样的说法:
这违反了锁定私有引用以避免意外死锁的原则。
作者指的是在事件的添加和删除操作中引用此对象的锁。
关于他所指的原则,并没有提供更多的细节,也许是因为这应该是显而易见的。在任何情况下,这对我来说并不明显。有人能给我一些启发并提供更多的细节吗?
发布于 2015-12-16 09:01:30
好的,如果您再读几行,似乎某些方法会执行锁定操作,但是您不知道哪个对象用于锁定。这是一个完全不同的问题,因为如果这是你想要做的,你就不能锁定同一个对象。所有试图保护相同数据的代码显然必须使用相同的锁。
就僵局而言,是的,这可能是个问题。线程1锁定对象A,然后锁定对象B。线程2锁在对象B上,然后执行无害的外观操作。应该没问题,对吧?但是,如果无辜的查找操作锁定了对象A,则会出现死锁。
“私人持有”与什么有什么关系?只有当锁定相同的变量时,线程1和线程2才能死锁。如果“无害查找操作”锁定了一个私有变量,其他代码无法访问该变量,那么您将不会陷入死锁。
发布于 2015-12-16 20:04:20
第一个死锁。这是指在锁中有一个线程,试图锁定其他线程,而另一个线程正在等待原始线程所拥有的锁。他们只是坐在那里等待另一条线的完成,但两者都不能。糟糕的时光。
问题是,对象的每个实例都可以充当锁的上下文。通过锁定私有实例,您可以(合理地)确信只有该类中的代码才能锁定该实例,因此您可以限制分析以查看该代码是否会死锁。
通过锁定this,类之外的代码也可以锁定该实例,这使得在您的代码库中找出潜在的死锁场景变得更加困难,而且一旦考虑到代码的外部使用者,就不可能了。
尽管如此,我发现这种最佳做法有点像货物崇拜。手动锁定变量的情况越来越普遍,而且通常需要锁定一个类范围。制作一个新的object仅仅是为了锁定它是不直观的,而且常常是过分的。
尽管如此,理解为什么这类事情是在那些没有过度杀戮的时候做的是非常重要的。
https://softwareengineering.stackexchange.com/questions/305211
复制相似问题