问题
I have this Singleton class inside a Web Application .
public class MyDAO
{
private static MyDAO instance;
private MyDAO() {
}
public static MyDAO getInstance() {
if (instance == null) {
instance = new MyDAO();
}
return instance;
}
I will access it this way
public void get_Data()
{
MyDAO dao = MyDAO.getInstance();
}
How many Objects of MyDAO class will be created if there are 3 Users accessing the Application ??
Will there be one instance of MyDAO per User ??
回答1:
You must synchronize the access to the getInstance()
. Otherwise some threads might see a not fully initialized version.
More on the Singleton Pattern
Once you synchronize it there will only be one instance in the JVM
. No matter how many variables references to the object. But if you are running N servers there will be one instance in each JVM
. So N instances in total.
You can double check if you are using Java 5.0
or older:
private static volatile MyDAO();
public synchronized static MyDAO getInstance() {
if (instance == null) {
instance = new MyDAO();
}
return instance;
But if your application always needs an instance you can eagerly instantiate it:
private static MyDAO = new MyDAO();
But I would go for the Bill Purge
solution:
private static class MyDAOHolder {
public static final MyDAO INSTANCE = new MyDAO();
}
public static MyDAO getInstance() {
return MyDAOHolder.INSTANCE;
}
回答2:
No, it's one per JVM. Be careful about thread safety.
I'd read "Effective Java" and follow the recommendations for how to write a singleton properly. Yours isn't it.
回答3:
There will only be one, that is the definition of a singleton.
To synchronize the instantiation, to make sure you only return a complete object you want to use:
private static Object semaphore = new Object();
public static MyDAO getInstance() {
synchronized(semaphore)
if (instance == null) {
instance = new MyDAO();
}
}
return instance;
}
来源:https://stackoverflow.com/questions/12545134/java-singleton-class-instances-in-a-web-based-application