Java 防止程序员获取类实例上的锁

Java 防止程序员获取类实例上的锁,java,concurrency,Java,Concurrency,是否可以编写一个类,使其他程序员无法获得该类实例的锁 锁滥用,如果有这样一个术语,可能是一个严重的杀手。不幸的是,程序员在交付线程安全代码的灾难性力量和有限的并发知识之间左右为难,通过采用锁定实例的方法可能会造成严重破坏,即使它们调用的操作实际上并不需要阻止实例的资源。唯一的方法是确保类实例不可见。例如,可以将is声明为私有嵌套类,并确保封闭类不会泄漏引用实例 基本上,如果某个对象可以获得对某个实例的引用,那么没有什么可以阻止它锁定它 通常,确保对锁对象的引用不会泄漏就足够了。。。不用担心类的可

是否可以编写一个类,使其他程序员无法获得该类实例的锁


锁滥用,如果有这样一个术语,可能是一个严重的杀手。不幸的是,程序员在交付线程安全代码的灾难性力量和有限的并发知识之间左右为难,通过采用锁定实例的方法可能会造成严重破坏,即使它们调用的操作实际上并不需要阻止实例的资源。唯一的方法是确保类实例不可见。例如,可以将is声明为私有嵌套类,并确保封闭类不会泄漏引用实例

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

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

跟进-回应OP的评论

您无法阻止其他人的代码将锁作为您的一个类的实例。但是您可以设计类,这样就不会干扰类的内部同步。只需安排类使用私有对象甚至对象实例进行同步

在更一般的意义上,您不能阻止应用程序程序员以您不喜欢的方式使用您的类。我在这里听到的其他例子包括试图强迫人们重写方法或提供特定的构造函数。即使将类字段声明为私有,也不会阻止一个决心坚定或绝望的程序员使用反射来获取它们

但另一方面,那些你试图阻止的事情其实并不愚蠢。例如,应用程序使用您的类作为锁对象实际上可能有一个合理的理由,尽管您反对它降低并发性。一般来说是这样的,只是这可能与特定情况无关


我的总体感觉是,记录类的设计使用方式,并设计API来鼓励这样做是一个好主意。但试图强行解决这一问题是不明智的。最终,针对您的类编写代码的人有责任合理地使用它们。。。不是您的。

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

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

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

跟进-回应OP的评论

您无法阻止其他人的代码将锁作为您的一个类的实例。但是您可以设计类,这样就不会干扰类的内部同步。只需安排类使用私有对象甚至对象实例进行同步

在更一般的意义上,您不能阻止应用程序程序员以您不喜欢的方式使用您的类。我在这里听到的其他例子包括试图强迫人们重写方法或提供特定的构造函数。即使将类字段声明为私有,也不会阻止一个决心坚定或绝望的程序员使用反射来获取它们

但另一方面,那些你试图阻止的事情其实并不愚蠢。例如,应用程序使用您的类作为锁对象实际上可能有一个合理的理由,尽管您反对它降低并发性。一般来说是这样的,只是这可能与特定情况无关


我的总体感觉是,记录类的设计使用方式,并设计API来鼓励这样做是一个好主意。但试图强行解决这一问题是不明智的。最终,针对您的类编写代码的人有责任合理地使用它们。。。不是您的。

如果类的成员需要防止并发访问,则应在内部执行锁定。否则,您将迫使使用它的人了解其实现的细节,而他们不应该看到它的接口。

如果类的成员需要防止并发访问,则应在内部执行锁定。否则,您将迫使那些使用它的人了解其实现的细节,而他们不应该看到它的接口。

创建新实例时,还将创建一个新线程,该线程将立即在实例上同步,并与thread.sleep进入睡眠状态。任何代码试图 实例上的同步将导致死锁,因此开发人员必须重新考虑他的方法

免责声明:
不要因为我的建议是愚蠢的,就投我的票。我知道是的。我只是回答这个问题。不要这样做

创建新实例时,还要创建一个新线程,该线程立即在实例上同步,并与thread.sleep进入睡眠状态。任何试图在实例上同步的代码都会死锁,因此开发人员必须重新考虑他的方法

免责声明:
不要因为我的建议是愚蠢的,就投我的票。我知道是的。我只是回答这个问题。不要这样做

这个问题不太清楚。你说的其他程序员是什么意思。您的代码库是否被分割成了某些人无法访问的部分?其他程序员=使用我开发的库的人,和/或需要使用我编写的类的代码库维护者。问题不太清楚。你说的其他程序员是什么意思。您的代码库是否被分割成了某些人无法访问的部分?其他程序员=使用我开发的库的人,和/或需要使用我编写的类的代码库维护者,而我相信您的回答是最合适的,我想它只是指出了这样一个事实,即类实例本身不能被保护而不被锁定。类ConcurrentHashMap可能突出了我的困境。尽管它具有高度复杂的并发处理能力,但有人可能只是同步它的实例并撤销所有优化。在这方面,我想将类命名为包含“Concurrent”也是一个很好的策略:]在ConcurrentHashMap上同步只会影响在其上同步的代码。任何调用映射的人通常都不会受到影响。虽然我相信您的回答是最合适的,但我想它只是指出了这样一个事实,即类实例本身不能被保护以防止被锁定。类ConcurrentHashMap可能突出了我的困境。尽管它具有高度复杂的并发处理能力,但有人可能只是同步它的实例并撤销所有优化。在这方面,我想将类命名为包含“Concurrent”也是一个很好的策略:]在ConcurrentHashMap上同步只会影响在其上同步的代码。正常情况下,任何调用地图的人都不会受到影响。