gpt4 book ai didi

java - Java Web 服务中的单例对象

转载 作者:搜寻专家 更新时间:2023-11-01 01:28:11 24 4
gpt4 key购买 nike

早上好我目前正在开发一个公开 Web 服务接口(interface)的 Java Web 应用程序。为了在内存中保留全局对象,我使用以下类作为单例:

public class SingletonMap {
private static final SingletonMap instance = new SingletonMap();
private static HashMap couponMap = null;
private static long creationTime;

private SingletonMap() {
creationTime = System.currentTimeMillis();
couponMap = new HashMap();
}

public static synchronized SingletonMap getInstance() {
return instance;
}

public static long getCreationTime() {
return creationTime;
}
}

我正在使用上面的类,以便为 Web 服务的所有线程提供相同的 HashMap 实例。维护SingletonMap对象的Web服务类如下:

@WebService()
public class ETL_WS {
private String TOMCAT_TEMP_DIR;
private final int BUFFER_SIZE = 10000000;
private static SingletonMap couponMap;
private static SingletonProductMap productCategoryMap;
private String dbTable = "user_preferences";

public ETL_WS() {
Context context = null;
try {
context = (Context) new InitialContext().lookup("java:comp/env");
this.TOMCAT_TEMP_DIR = (String) context.lookup("FILE_UPLOAD_TEMP_DIR");
}catch(NamingException e) {
System.err.println(e.getMessage());
}

public long getCouponMapCreationTime() {
return couponMap.getCreationTime();
}

}

我使用 getCouponMapCreationTime() 方法的原因是检查 Web 服务的所有线程是否都在访问同一个对象。上述做法是否正确?性能开销如何?您认为我需要 Singleton 属性,还是我可以为所有线程使用静态 HashMap?如果我使用静态 HashMap,如果没有线程处于 Activity 状态,它是否会被垃圾回收?

感谢您的宝贵时间。

最佳答案

JAX-WS 网络服务本身就是一个单例。这意味着所有请求都将使用单个 Web 服务实例(如 Servlet)处理。

因此,该类的任何成员都将在所有请求之间“共享”。在您的情况下,您不需要让您的成员(即 couponMap)成为静态属性。

结论:别担心,您的所有线程(请求)都将访问同一个“couponMap”。因为您不再需要 getCouponMapCreationTime,我认为您可以消除 SingletonMap 抽象并在您的 Web 服务类中直接使用 Map。

但是我有一些非常重要的事情要补充。如果多个线程(请求)将访问您的 map ,您必须使其成为线程安全的!!!有很多方法可以做到这一点,但我会给出一个想法:使用 ConcurrentHashMap 而不是 HashMap。这将使您所有的 get()、put()、remove() 操作都是线程安全的!如果您需要更大的范围,您可以使用同步块(synchronized block),但请避免使用同步方法,因为范围太大并且始终在 this 对象上同步。

关于java - Java Web 服务中的单例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11096310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com