Java:基于Web的应用程序中的单例类实例
我在Web应用程序中有这个单例类Java:基于Web的应用程序中的单例类实例,java,singleton,Java,Singleton,我在Web应用程序中有这个单例类 public class MyDAO { private static MyDAO instance; private MyDAO() { } public static MyDAO getInstance() { if (instance == null) { instance = new MyDAO(); } return instance;
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实例吗 只有一个,那就是单身的定义 要同步实例化,请确保只返回要使用的完整对象:
private static Object semaphore = new Object();
public static MyDAO getInstance() {
synchronized(semaphore)
if (instance == null) {
instance = new MyDAO();
}
}
return instance;
}
您必须同步对
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();
但我会选择法案清除
解决方案:
private static class MyDAOHolder {
public static final MyDAO INSTANCE = new MyDAO();
}
public static MyDAO getInstance() {
return MyDAOHolder.INSTANCE;
}
不,每个JVM一个。注意线程安全
我读过《有效的Java》,并遵循如何正确编写单例的建议。你的不是。如果多个线程进入该If条件,那么它将被实例化多次。它不是线程安全的。即使对于粘性类型的负载平衡器,我们也需要这个同步块吗??请指定。同步方法可能有点过分,因为您只需要在创建时同步。您是说3个用户访问还是3个java后端正在运行?3个用户访问作为群集过程一部分部署在3个Web服务器上的应用程序