【问题标题】:Threadsafe Guice Binding线程安全 Guice 绑定
【发布时间】:2011-09-29 09:41:07
【问题描述】:

我目前正在重构现有项目的服务器端。

我们现在使用 guice 来绑定特定的模块及其对象。

在过去 2 周中,我们经常遇到一个问题,看起来好像 guice 混淆了一些已使用的对象实例。

问题是一个类负责构建将插入数据库的字符串。此类从 rpc 服务中使用,该服务可以连续快速调用。所以发生的事情是 RPC 服务 1 调用这个类,同时 RPC 服务 2 也在调用这个类并更改用于字符串构建的全局参数。 builder 类有点愚蠢,因为它从方法中获取参数,将参数的某些部分设置为全局变量并处理字符串。

我认为主要问题是全局变量,但我不知道如何以优雅的方式摆脱它们。它们用于从 init 方法调用的所有其他方法(例如 startMethod() 调用 buildStringOne()、buildStringTwo() 以及访问在 startMethod() 中设置的两个全局变量)。

有没有更好的方法可以绑定这个对象,还是我需要删除全局变量并将它们作为其他方法的参数提供?

感谢您的帮助。

【问题讨论】:

    标签: guice gwt-rpc


    【解决方案1】:

    使用共享可变状态是自找麻烦。听起来您的根本问题确实是线程安全问题。但是,您不必通过使可变状态线程安全来解决线程安全问题——您也可以只使状态仅对一个线程可见。

    您也许可以使用 Guice 的请求范围对象来解决这个问题。如果麻烦的类可以以注入的方式使用,Guice 将为每个 servlet 请求提供一个新实例。如果您在范围比 Request(例如 Singleton)更长的类中使用它,请注入 Provider。调用 get() 将为调用线程正在处理的请求返回适当的 Foo 实例。

    请参阅https://code.google.com/p/google-guice/wiki/ServletModule#Using_RequestScope 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多