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; }