java - 尝试在java项目中执行唯一性?

标签 java

我正在使用一个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/

相关文章:

java - 仅在启动时启动时绑定(bind)异常 [Raspbian]

java - 如何使用 java 和 CMU Sphinx 将音频文件分解为多个片段,然后将分解的音频文件转录为文本

java - Spring Boot在启动api之前将数据加载到sql

java - 使用 Streams API 收集器平均 BigDecimals

java - 我应该将用户上传的文件保存在服务器的什么位置?

java - 如何从属性文件初始化 Jersey 查询参数的默认值

Java方法返回可在SQL IN语句中使用的字符串

java - 从 SwingWorker 执行 SwingWorker - 等待第一个停止

java - 大数的模块化归约

包含 jars 的 java Jar => java.lang.NoClassDefFoundError -> 如何包含 .jar 文件