我正在使用一个java库,它有一个带有方法的单例类 - createTask()
和 addPointsToTask()
该库旨在用于执行多个请求的任何 java 服务。
服务在处理单个请求期间应该能够仅调用createTask
一次。在同一线程执行中对 createTask
的任何进一步调用都应该失败。 addPointsToTask
可以调用任意多次。
作为库所有者,如何限制此方法每个线程仅调用一次?
我探索过ThreadLocal ,但认为这不符合我的目的。
一种解决方案是要求使用该库的服务在 threadLocal 中设置唯一的 id,但由于此“设置为线程本地”解决方案位于库的边界之外,因此这不是完整的解决方案证明解。
有什么提示吗?
最佳答案
简短的回答:你不会得到“万无一失”的解决方案;即某人无法颠覆的解决方案。
除非您在您控制的 JVM 平台上运行您的库,否则您的库的用户如果足够努力,将能够找到一种方法来颠覆“每个线程只能运行一次”的限制。例如:
- 他们可以使用反射来访问实现限制的对象或类的私有(private)状态。
- 他们可以使用字节码注入(inject)来破坏您的代码。
- 他们可以反编译并替换您的代码。
- 他们可以修改他们的 JVM 来对你的代码做一些奇怪的事情。 (OpenJDK 源代码可供任何人使用。)
问自己以下问题:
- 从您试图限制的程序员的角度来看,此限制合理吗?
- 明智的程序员会有充分的理由尝试打破它吗?
- 您是否考虑过您的库的可能用例,多次调用
createTask()
是合理的?例如,涉及使用线程池的用例?
如果您这样做是因为您认为允许多个 createTask()
调用会破坏您的库,我的建议是:
- 通过 javadoc 和其他文档告诉程序员,如果他们做了您试图阻止的事情,可能会出现问题。
- 实现“软”检查,并为程序员提供一种禁用该检查的简单方法。 (但如果您认为合适,请默认进行检查。)
重点是,明智的程序员不会故意破坏限制,除非有充分的理由。如果他们这样做了,并且伤害了自己,那不是你的问题。
另一方面,如果您出于“商业原因”或为了停止“作弊”或类似原因而实现此限制,我的建议是认识到坚定的用户将能够颠覆任何 当他们在其平台上运行代码时,您尝试嵌入代码的限制。如果这从根本上破坏了您的模型,请寻找不同的模型。
关于java - 尝试在java项目中执行唯一性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57726646/