我在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实例吗?
答案 0 :(得分:5)
您必须同步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;
}
答案 1 :(得分:2)
不,这是每个JVM的一个。小心线程安全。
我读过“Effective Java”并遵循有关如何正确编写单例的建议。你的不是它。
答案 2 :(得分:0)
只有一个,即单身人士的定义。
要同步实例化,以确保只返回要使用的完整对象:
private static Object semaphore = new Object();
public static MyDAO getInstance() {
synchronized(semaphore)
if (instance == null) {
instance = new MyDAO();
}
}
return instance;
}