:cry:
在我理解,单例就是在整个jvm中只存在一个类实例。
但是不知道在什么时候,在什么地方使用单例。
所以举个例子,帮忙看下我的理解对不对。
jsp页面 userName=1 passWord=2 (用户1提交)
jsp页面 userName=3 passWord=4 (用户2提交)
两人同时新增的话,进入action,如果实体类(Model)是单例的话,就会出现用户甲和用户乙的数据混乱对吗?
[quote]
问题1:在我理解,单例就是在整个jvm中只存在一个类实例。 理解对不对
问题2:在什么时候,在什么地方使用单例。
问题3:我举的例子
单例不是同一实例吗,两个用户调同一个实例并且修改,当然会产生覆盖的问题啊。
[/quote]
1.对的
2.单例主要是用在你只需要一个实例的时候,分为2种:多个实例就会出问题,创建实例消耗太大。
比如说:写日志,你如果多个实例大开同一个文件写日志,那肯定是不行的(当然,如果你非要多个实例之间做同步,打开文件,写,关,然后下一个实例,这种,那性能就不行了哦)
3.你举的那个例子,在Struts2里,比如说把Action定义成下面这样,那就是不行的
[code="java"]
public class Login {
private String name;
private String pass;
//get/set......
}
[/code]
这样子用单例就会乱掉,所以Struts2不能用单例解决这种问题。
如果是Struts1,是封装在Form里作为方法参数传入的就没有问题。
如果你的单例类里userName和passWord作为成员变量的话,是会混乱的。
不会产生数据混乱。数据库在执行插入操作的时候是锁定状态的,不会存在两条同时插入的情况。
……
不知道楼主的意思,
单例模式多用于Service或DAO,实体类是不会用单例模式的。
……
[code="java"]
public class Singleton {
private static Singleton uniqueInstance;
private int num = 0;
private Singleton() {
}
public synchronized static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
public /*synchronized*/ void plusNum() {
++num;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(num);
}
}
[/code]
[code="java"]
public class ThreadTest implements Runnable {
public void run() {
Singleton sing = Singleton.getInstance();
sing.plusNum();
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
Thread thread = new Thread(new ThreadTest());
thread.start();
}
}
}
[/code]
LZ看这个代码,就是乱了。所以Struts2的Action不能配置成单例的,但是Struts1就没有这个问题。
[quote]
问题1:在我理解,单例就是在整个jvm中只存在一个类实例。 理解对不对
问题2:在什么时候,在什么地方使用单例。
问题3:我举的例子
单例不是同一实例吗,两个用户调同一个实例并且修改,当然会产生覆盖的问题啊。
[/quote]
回答1:差不多,单例是在每个jvm(可以理解为进程)里只存在一个实例。
回答2:可能有些拗口,在你确定这个类在整个Application中有且只能有一个实例时,可以选择性使用单例模式。话说,所有的设计模式不是从技术上直接诞生的,而是在实际应用和需求中逐渐出现、总结的。所以,不要为了要用设计模式而去使用他,而应该在有了这种需求时再去使用。当然,所谓的选择性使用,因为还有基于如spring、EJB等等实现的容器级别的单例,还是这句话,看需求。
回答3:可能会有冲突,但单例模式下的类多是线程安全的,所以还要看具体情况。
我上面已经给出了一个会乱掉的例子了啊
[quote]
我是觉得,用单例的那些东西,完全不需要写成单例。
你举得例子是写日志,我希望有个具体一点的例子反驳我的观点,让我正确的认识。
[/quote]
话说,楼主好像要问的是[color=red]为什么[/color]要用单例,而不是[color=red]怎么[/color]用单例……
的确,所有的单例模式的类其实都可以不用单例,这在一个人开发的时候其实问题不是太大。但当遇到多人合作开发时,就有可能出现问题。
某个类(可能是DAO,就是数据库访问对象,也可能是其他第三方工具类,比如计数器什么的)是其他人写的,这个类并没有试用单例模式,那么你在使用时就会有这样的疑惑:[color=red]这个类是直接new出来呢?还是用工厂类创建呢?还是从其他地方引用进来呢?[/color]
这就多了许多不确定性。如果这个类是用单例模式的,那就简单了,直接用单例模式获取就行了。
诸如此类,还有其他的功能,比如,这个类必须只能有一个,那么在代码层严格控制,使用单例模式就是个不错的方案……等等。都是在实际开发中有一定作用的。
哦,那再比如说数据库连接池,也只有一个实例,要连数据库就问连接池要。缓存之类的。