线程安全Guice绑定

线程安全Guice绑定,guice,gwt-rpc,Guice,Gwt Rpc,我目前正在重构一个现有项目的服务器端 我们现在使用guice绑定特定模块及其对象 在过去的两周里,我们经常遇到一个问题,看起来guice将一些使用过的对象实例混为一谈 这个问题是一个类,它负责构建一个将插入数据库的字符串。这个类是从一个rpc服务中使用的,这个服务可以很快地在一行中调用。因此,RPC服务1调用这个类,同时RPC服务2也调用这个类,并更改用于构建字符串的全局参数。builder类有点愚蠢,因为它从一个方法中获取一个param,将param的某些部分设置为全局变量并处理字符串 我认为

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

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

在过去的两周里,我们经常遇到一个问题,看起来guice将一些使用过的对象实例混为一谈

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

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

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


谢谢您的帮助。

使用共享可变状态会带来麻烦。听起来您的根本问题实际上是一个线程安全问题。但是,您不必通过使可变状态成为线程安全的方式来解决线程安全问题——您也可以使状态只对一个线程可见

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

更多信息,请参阅