阻止程序员获取类实例的锁定

时间:2010-09-24 09:58:55

标签: java concurrency

是否可以编写一个类,以便其他程序员无法获取该类实例的锁定?

锁定滥用,如果有这样的术语,可能是一个严重的杀手。不幸的是,程序员在提供线程安全代码和有限的并发知识的灾难性力量之间徘徊,即使在他们调用实际上不需要阻止实例资源的操作时,也可以通过采用锁定实例的方法来破坏< / p>

3 个答案:

答案 0 :(得分:6)

执行此操作的唯一方法是确保类实例不可见。例如,您可以声明为私有嵌套类,并确保封闭类不会泄漏引用实例。

基本上,如果有东西可以获得对实例的引用,那么没有什么可以阻止它锁定它。

通常情况下,确保对锁定对象的引用不会泄漏就足够了......而不用担心类可见性。

关注 - 响应OP的评论。

你无法阻止别人的代码锁定你的某个类的实例。但是你可以设计你的类,这样就不会干扰你的类内部同步。只需安排您的类使用私有对象(甚至是Object实例)进行同步。

从更一般的意义上讲,您无法阻止应用程序员以您不喜欢的方式使用您的类。我听说过的其他例子(这里)包括尝试强制人员覆盖方法或提供特定的构造函数。即使将您的类字段声明为私有也不会阻止一个坚定的(或绝望的)程序员使用反射来获取它们。

但另一方面,那些你试图阻止的东西实际上可能并不是愚蠢的。例如,可能实际上是应用程序将您的类用作锁定对象的合理原因,尽管您反对它会降低并发性。 (一般情况下,它只是在特定情况下可能不相关。)

我的一般感觉是,记录您的类的设计方式是一个好主意,并设计API来鼓励这样做。但试图强迫这个问题是不明智的。最终,代码反对你的课程的人有责任明智地使用它们......不是你的。

答案 1 :(得分:0)

如果某个类的成员需要防止并发访问,则应在内部进行锁定。否则,当他们不能看到它的界面时,你强迫那些使用它的人理解它的实现细节。

答案 2 :(得分:0)

创建新实例时,还要创建一个新线程,该线程立即在实例上同步并进入休眠状态(使用Thread.sleep())。尝试在实例上进行同步的任何代码都会陷入僵局,因此开发人员必须重新考虑他的方法。

<强>声明: 不要投票给我,因为我的建议是疯了。我知道它是。我只是在回答这个问题。实际上不要这样做!!!