日期:2014-05-20  浏览次数:20764 次

static与Singleton
static只是在程序加载的时候分配内存,有没有保证同步?
singleton模式保证只有一个实例,但是有没有什么不好的地方?有没有坚决不能用singgleton而必须用static声明一个方法。

------解决方案--------------------
探讨
在这里singleton保证只有一个实例,而同样用static也保证了只有一个实例,除了static在程序加载的时候就分配内存,还有其他区别没有?
相反如果不计较内存,static是不是更简洁。

------解决方案--------------------
当然不是!
首先:Singleton是对象,而用static修饰class的时候是方法集合!
其次上述的差别也很大:
第一:Singleton是对象,static 是方法;
第二:Singleton可以进行继承或接口实现,
第三:Singleton可以保持状态,可以延迟加载,可以序列化
第四:Singleton可以状态化,这样多个单态类在一起就可以作为一个状态仓库一样向外提供服;
另外:应用如果基于容器,则应该尽量少用或者不用Singleton!


------解决方案--------------------
Java code
public class Singleton {

    private static Singleton s = null;

    private Singleton() { }

    public static Singleton getInstance() {
        if (s == null) s = new Singleton();
        return s;
    }

    public void fun() { /* some code */ }

    public static void staticfun() { /* some code */ }

    public static void main(String[] args) {
        Singleton.getInstance().fun();
        Singleton.staticfun();
    }

}

------解决方案--------------------
探讨
引用:
引用楼主 wangxiaomei2008 的帖子:
static只是在程序加载的时候分配内存,有没有保证同步? ==>需要吗?


比如写的一个static的方法。其中读写文件了,此时能要保证我们读写不会出现问题。static方法中同样要用到我们自己加同步吗?

------解决方案--------------------
探讨
这个比上面的效率高:
class Elvis1 {
// 共有静态“final域”
public static final Elvis1 INSTANCE = new Elvis1();

private Elvis1() {
super();
System.out.println(INSTANCE);
}

public void tell() {
System.out.println(INSTANCE);
}

}

------解决方案--------------------
探讨


单子模式为的是保证只有一个实例,只有一个实例有什么不好的地方?哪些场合用多个实例更好?假如5个实例,我们怎样保证就只有5个实例,而这5个实例都不被销毁?

------解决方案--------------------
探讨
向五星级发问: 一般情况下都是多实例,那一般情况下我们需要专门管理这些实例吗?我们建立对象池与java的自动销毁机制是不是有点矛盾?
一方面我们希望就5个实例,一方面java又自动销毁。