0

我在 Google App Engine 上使用 Restlet 2.1.2,我正在考虑它的线程安全性。<threadsafe>在我的 GAE 配置中设置为 true。

一般来说,文档中有一些类的并发说明,例如ServerResource类是线程安全的,并且为每个调用者线程创建一个新实例。这意味着,我可以安全地将状态存储在成员变量中(例如来自请求 URL 的参数)。此外,Filter该类不是线程安全的,并且此类的一个对象可以由多个线程同时调用,因此无法将状态保存在成员变量中,并且ThreadLocal可以/应该使用类似的东西。

此外,所有Authenticator子类都不是安全的,因为它们是Filter. Authenticators使用 aVerifier来验证登录凭据,并且类的文档中没有并发注释Verifier...

我的问题是:

1)我可以安全地将某些状态存储在Verifier子类中还是必须使用类似的东西ThreadLocal?我认为第二种选择是正确的。...我只想读取一个数据存储区来获取用户帐户,然后User根据此信息创建一个实例。我正在继承一个SecretVerifier.

2)在某个地方是否有一个示例/文章,其中包含有关 Restlet 中这些多线程问题的信息,而不仅仅是分散在文档中?至少有关每个调用者线程具有实例的类以及在多个调用者线程之间共享哪些实例的信息会很好。

4

1 回答 1

1

首先,让我澄清一下,整个 Restlet API 被设计为供并发线程使用。

大多数类(尤其是 org.restlet.Restlet 的子类)旨在允许多个线程同时共享实例,因此这些类必须是线程安全的,即如果它们在这些线程之间共享变量,则必须通过 final 或线程安全类(Concurrent* 类)的 volatile 字段。

否则,总是可以将信息存储在请求/响应对象本身中,尤其是在它们的“属性”属性中,而不是通过线程局部变量。

据我所知,只有 Resource 子类被设计为一次由单个线程调用,但请注意,您可能仍需要处理线程可见性问题。

希望这可以澄清。

于 2013-05-16T15:00:29.037 回答