我正在使用 JAX-RS(Jersey 实现)来构建 Web 服务。
Web 应用程序的入口点是一个扩展Application
和覆盖该getClasses
方法的类。我了解 JAX-RS 将为每个新请求创建一个新实例。
可以改为覆盖getSingleton
。我的理解是,这将为所有请求重用相同的实例。但是,这种方法(假设我是正确的)不会破坏 Web 应用程序中的并发性吗?也就是说,由于始终使用相同的实例,传入的请求将一次处理一个(FIFO?)。
我正在使用 JAX-RS(Jersey 实现)来构建 Web 服务。
Web 应用程序的入口点是一个扩展Application
和覆盖该getClasses
方法的类。我了解 JAX-RS 将为每个新请求创建一个新实例。
可以改为覆盖getSingleton
。我的理解是,这将为所有请求重用相同的实例。但是,这种方法(假设我是正确的)不会破坏 Web 应用程序中的并发性吗?也就是说,由于始终使用相同的实例,传入的请求将一次处理一个(FIFO?)。
不,不会的。JVM 中的多个线程能够同时访问一个类的一个实例(在这种情况下调用资源上的资源方法)。您只需要确保您的资源是线程安全的。
为了说明和之间的区别getClasses()
,getSingletons()
假设我们有一个HelloWorldResource
类似的:
@Path("helloworld")
public class HelloWorldResource {
private volatile int counter = 0;
@GET
@Produces("text/plain")
public String getHello() {
return "Hello World! " + counter++;
}
}
多次调用getHello
资源方法会返回:
如果您通过以下方式注册资源getClasses
Hello World! 0
Hello World! 0
Hello World! 0
...
如果您getSingletons
用来注册您的资源
Hello World! 0
Hello World! 1
Hello World! 2
...