我实现了这样的东西:
@Path("/svc")
public class Service {
Resource rsc = Resource.getInstance();
@GET
public String doGet() {...}
}
public class Resource {
public static Resource instance;
private Resource() {...}
public static getInstance(){
if (instance == null){
return new Resource();
}
return instance;
}
}
Service
类是实现 GET
和 POST
方法的地方,其中 Resource
是单例类临时存储一些数据的地方。
但是,当我测试它时,我发现单例类每次调用方法时都会获得一个新实例。 singleton 类只是一个经典的 Java 单例实现。我知道添加 @Singleton
注释可以解决问题,但我想知道是什么导致了这种行为?
最佳答案
简短回答
您的单例不是单例。
长答案以及如何解决它
instance
字段是 public
,并且您始终返回一个新的 Resource
实例,而不是将其分配给 instance
字段。
还建议将您的类标记为 final
并在 getInstance()
方法中使用同步:
public final class Resource {
private static Resource instance;
private Resource() {
}
public static synchronized Resource getInstance() {
if (instance == null) {
instance = new Resource();
}
return instance;
}
}
但是,这不是实现单例的最佳方式。
更多信息,请参阅What is an efficient way to implement a singleton pattern in Java?
关于java - 为什么 Jersey 会导致单例类无法工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33819231/