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()的访问。 否则某些线程可能会看到未完全初始化的版本。

更多关于Singleton模式

同步后, 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”并遵循有关如何正确编写单例的建议。 你的不是它。

http://electrotek.wordpress.com/2008/08/06/singleton-in-java-the-proper-way/

只有一个,即单身人士的定义。

要同步实例化,请确保只返回要使用的完整对象:

 private static Object semaphore = new Object(); public static MyDAO getInstance() { synchronized(semaphore) if (instance == null) { instance = new MyDAO(); } } return instance; }