Java:基于Web的应用程序中的Singleton类实例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:基于Web的应用程序中的Singleton类实例相关的知识,希望对你有一定的参考价值。
我在Web应用程序中有这个Singleton类。
public class MyDAO
{
private static MyDAO instance;
private MyDAO() {
}
public static MyDAO getInstance() {
if (instance == null) {
instance = new MyDAO();
}
return instance;
}
我会这样访问它
public void get_Data()
{
MyDAO dao = MyDAO.getInstance();
}
如果有3个用户访问应用程序,将创建多少个MyDAO类对象?
每个用户会有一个MyDAO实例吗?
答案
您必须同步访问getInstance()
。否则某些线程可能会看到未完全初始化的版本。
同步后,JVM
中只会有一个实例。无论有多少变量引用该对象。但是如果你运行N个服务器,每个JVM
中都会有一个实例。总共N个实例。
你可以仔细检查你是否使用Java 5.0
或更老:
private static volatile MyDAO();
public synchronized static MyDAO getInstance() {
if (instance == null) {
instance = new MyDAO();
}
return instance;
但是如果你的应用程序总是需要一个实例,你可以急切地实例化它:
private static MyDAO = new MyDAO();
但我会选择Bill Purge
解决方案:
private static class MyDAOHolder {
public static final MyDAO INSTANCE = new MyDAO();
}
public static MyDAO getInstance() {
return MyDAOHolder.INSTANCE;
}
另一答案
不,它是每个JVM一个。线程安全要小心。
我读过“Effective Java”并遵循有关如何正确编写单例的建议。你的不是它。
另一答案
只有一个,即单身人士的定义。
要同步实例化,以确保只返回要使用的完整对象:
private static Object semaphore = new Object();
public static MyDAO getInstance() {
synchronized(semaphore)
if (instance == null) {
instance = new MyDAO();
}
}
return instance;
}
以上是关于Java:基于Web的应用程序中的Singleton类实例的主要内容,如果未能解决你的问题,请参考以下文章
从基于 Java 的 azure Web 应用程序读取本地文件共享
csharp C# - 简单的SerialPort单例类|示例:https://heiswayi.github.io/2016/csharp-simple-serialport-singleton-c