我在Google App Engine上使用Restlet 2.1.2,我正在考虑它的线程安全性。在我的GAE配置中,<threadsafe>
设置为true。
一般来说,某些类的文档中有并发注释,例如: ServerResource
类是线程安全的,并为每个调用者线程创建一个新实例。这意味着,我可以安全地将状态存储在成员变量中(例如来自请求URL的参数)。此外,Filter
类不是线程安全的,并且该类的一个对象可以同时被多个线程调用,因此状态不能保存在成员变量中,并且可以/应该使用类似ThreadLocal
的类。
此外,所有Authenticator
子类都不是安全的,因为它们是Filter
的子类。 Authenticators
使用Verifier
来验证登录凭据,Verifier
类的文档中没有并发注释...
我的问题是:
1)我可以安全地将某个州存储在Verifier
子类中,或者我必须使用类似ThreadLocal
的内容吗?我认为第二种选择是正确的。 ...我只想读取一个数据存储区来获取用户帐户,然后根据此信息创建一个User
实例。我正在继承SecretVerifier
。
2)在某个地方是否存在一个示例/文章,其中包含有关Restlet中这些多线程问题的信息,而不仅仅是分散在文档中?至少有关每个调用者线程实例的类以及哪些实例在多个调用者线程之间共享的信息都很棒。
答案 0 :(得分:1)
首先,让我澄清整个Restlet API被设计为由并发线程使用。
大多数类(特别是org.restlet.Restlet的子类)被设计为允许多个线程同时共享实例,因此这些类必须是线程安全的,因为如果它们在这些线程之间共享变量,它必须是通过线程安全类的最终或易失性字段(Concurrent * classes)。
否则,始终可以将信息存储在Request / Response对象中,尤其是在“attributes”属性中,而不是通过线程局部变量。
据我所知,只有Resource子类被设计为一次由一个线程调用,但请注意,您可能仍需要处理线程可见性问题。
希望这澄清。