public class Singleton { private static Singleton s = null; private Singleton() { } public getInstance() { if (s == null) s = new Singleton(); return s; }} 在上面例子中,静态域只是实现单子模式的一种手段,跟同步不同步没多大关系,如果想使这个唯一的实例成为线程安全的,可以把它的实例方法修饰成同步的,或在操作这个唯一的实例时使用同步块。
更正一下,上面代码中落掉了个 public: public class Singleton { private static Singleton s = null; private Singleton() { } public static getInstance() { if (s == null) s = new Singleton(); return s; }}
汗,昨天一定没睡好,是落了个 static。
public class Test { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); singleton.fun(); // This is singleton function StaticTest.fun(); // This is static function }}class Singleton { private static Singleton instance = null; public static synchronized Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } public void fun() { } }class StaticTest { public static void fun() { } } 我的意思是用这两种方式调用fun有什么区别?哪个场合用哪个? 第二个问题是:假如我们用static的方法,能保证不用synchronized 进行读写文件正确吗?与以上问题无关。
7楼老大:方法没有返回值么? public ??? getInstance() { if (s == null) s = new Singleton(); return s; }
请看9楼,晚睡觉的罪过,唉,再次改过: public class Singleton { private static Singleton s = null; private Singleton() { } public static Singleton getInstance() { if (s == null) s = new Singleton(); return s; }}
[code] public class Singleton{ private Singleton(); private static Singleton intance = new Singleton(); public static Singleton getInstance(){ return instance; } } [/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(); }} 如上例: 1. 静态方法更占存储资源?首先明确一下,静态成员并不是什么程序加载时创建并初始化的,而是类加载时进行。类的加载是第一次真正用到它的时候(拿类new实例或调用它的静态方法)进行的,而这个加载过程需要将 class 文件中构成类的静态和实例方法等类的成员的字节码指令一同加载到内存中,而后要为静态域分配存储空间并使用静态块对其进行初始化(如果有的话)。在上面例子中,类加载后,所有成员(包括fun和staticfun)的字节码指令均在内存中了,随时等待着调用,并且静态域 s 所占用的存储空间也用空引用初始化好了。 2. 当第一次调用 getInstance() 方法时会创建此类的唯一实例(所谓的单子出现),其实也可以在声明 s 时 new 它的唯一实例,将实例化延后是为了避免类加载后实例使用前内存的浪费。 3. 静态方法很少是线程不安全的,所谓线程安不安全是指当多个线程同时操作一个对象(通过调用它的实例方法)时是否会造成对象内部状态的破坏,而静态方法不是用来对实例进行操作的,所以一般不用考虑线程同步。楼主所说的情况是在静态方法中读写文件,此时如果多个线程同时通过调用此静态方法对文件操作肯定会造成文件内容的破坏,但这不是线程没同步造成的,因为没有对象的状态被破坏。但可以利用线程同步机制防止上面情况的发生。 4. 如 16楼 所说,单子模式是利用唯一的实例保存系统的状态,提供的实例方法也是为了对这个唯一的实例进行操作,而静态方法多是一些工具方法,Math 类中的静态方法就是一个典型的例子,如果仅仅是想不自己创建类的实例就可以调用到某些方法来完成一定的操作,那完全没必要也不应该使用单子模式。
public class Singleton { private static Singleton s = null; private Singleton() { } public static getInstance() { if (s == null) s = new Singleton(); return s; }}//需要更证为如下:public class Singleton { private static Singleton s = null; static Singleton() { s = new Singleton();} private Singleton() { } public static getInstance() { if (s == null) s = new Singleton(); return s; }}
楼主【wangxiaomei2008】截止到2008-06-26 11:34:19的历史汇总数据(不包括此帖):
发帖数:2 发帖分:70
结贴数:0 结贴分:0
未结数:2 未结分:70
结贴率:0.00 % 结分率:0.00 %
如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
singleton模式指的是同时只能生成一个对象,和static涵义不一致,没有可比性的说。
static只是在程序加载的时候分配内存,有没有保证同步?
应该是不能保证同步的
比如写的一个static的方法。其中读写文件了,此时能要保证我们读写不会出现问题。static方法中同样要用到我们自己加同步吗?
if (s == null) s = new Singleton();
return s;
}}
在上面例子中,静态域只是实现单子模式的一种手段,跟同步不同步没多大关系,如果想使这个唯一的实例成为线程安全的,可以把它的实例方法修饰成同步的,或在操作这个唯一的实例时使用同步块。
public class Singleton { private static Singleton s = null; private Singleton() { } public static getInstance() {
if (s == null) s = new Singleton();
return s;
}}
public class Test
{
public static void main(String[] args)
{
Singleton singleton = Singleton.getInstance();
singleton.fun(); // This is singleton function StaticTest.fun(); // This is static function }}class Singleton
{
private static Singleton instance = null; public static synchronized Singleton getInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
} public void fun()
{
}
}class StaticTest
{
public static void fun()
{
}
}
我的意思是用这两种方式调用fun有什么区别?哪个场合用哪个?
第二个问题是:假如我们用static的方法,能保证不用synchronized 进行读写文件正确吗?与以上问题无关。
相反如果不计较内存,static是不是更简洁。
static方法是没有实例而言的,虽然分配了内存,只是加载到内存中,但加载到内存并不一定有就有实例吧的意思是用这两种方式调用fun有什么区别?哪个场合用哪个?static方法就像普通的C中的方法一样,只不过前面要加个类名,你也可以放到其他类下面, 实例方法则必须要有个实例才能调用,就像人必须要存在才可能说话样的
首先:Singleton是对象,而用static修饰class的时候是方法集合!
其次上述的差别也很大:
第一:Singleton是对象,static 是方法;
第二:Singleton可以进行继承或接口实现,
第三:Singleton可以保持状态,可以延迟加载,可以序列化
第四:Singleton可以状态化,这样多个单态类在一起就可以作为一个状态仓库一样向外提供服;
另外:应用如果基于容器,则应该尽量少用或者不用Singleton!
单例模式的实现不就是声明一个static的引用吗
http://topic.csdn.net/u/20080604/20/617a3354-1abe-42f8-b829-e1d3d8334c6b.html
将问题简化点:第一个问题:singleton有什么不好的地方?第二个问题:什么样的情况你会用static?除了消耗资源有什么不好的地方?
public ??? getInstance() {
if (s == null) s = new Singleton();
return s;
}
public class Singleton { private static Singleton s = null; private Singleton() { } public static Singleton getInstance() {
if (s == null) s = new Singleton();
return s;
}}
public class Singleton{
private Singleton();
private static Singleton intance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
[/code]
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();
}}
如上例:
1. 静态方法更占存储资源?首先明确一下,静态成员并不是什么程序加载时创建并初始化的,而是类加载时进行。类的加载是第一次真正用到它的时候(拿类new实例或调用它的静态方法)进行的,而这个加载过程需要将 class 文件中构成类的静态和实例方法等类的成员的字节码指令一同加载到内存中,而后要为静态域分配存储空间并使用静态块对其进行初始化(如果有的话)。在上面例子中,类加载后,所有成员(包括fun和staticfun)的字节码指令均在内存中了,随时等待着调用,并且静态域 s 所占用的存储空间也用空引用初始化好了。
2. 当第一次调用 getInstance() 方法时会创建此类的唯一实例(所谓的单子出现),其实也可以在声明 s 时 new 它的唯一实例,将实例化延后是为了避免类加载后实例使用前内存的浪费。
3. 静态方法很少是线程不安全的,所谓线程安不安全是指当多个线程同时操作一个对象(通过调用它的实例方法)时是否会造成对象内部状态的破坏,而静态方法不是用来对实例进行操作的,所以一般不用考虑线程同步。楼主所说的情况是在静态方法中读写文件,此时如果多个线程同时通过调用此静态方法对文件操作肯定会造成文件内容的破坏,但这不是线程没同步造成的,因为没有对象的状态被破坏。但可以利用线程同步机制防止上面情况的发生。
4. 如 16楼 所说,单子模式是利用唯一的实例保存系统的状态,提供的实例方法也是为了对这个唯一的实例进行操作,而静态方法多是一些工具方法,Math 类中的静态方法就是一个典型的例子,如果仅仅是想不自己创建类的实例就可以调用到某些方法来完成一定的操作,那完全没必要也不应该使用单子模式。
多线程读写文件和static、单件没什么关系。没有了数据库的并发保障、读写数据当然需要自己控制同步。就算是一个最简单的不是单件也没有static方法的读写文件的DAO也得同步一下啊。
class Elvis2 {
private static final Elvis2 INSTANCE = new Elvis2(); private Elvis2() {
super();
System.out.println(INSTANCE);
} public static Elvis2 getINSTANCE() {
return INSTANCE;
} public void tell() {
System.out.println(INSTANCE);
}}
class Elvis1 {
// 共有静态“final域”
public static final Elvis1 INSTANCE = new Elvis1(); private Elvis1() {
super();
System.out.println(INSTANCE);
} public void tell() {
System.out.println(INSTANCE);
}}
确实效率会高些(我指获取这个单子实例时),但请假设这个类中同时有静态方法,如果这个类是类库中的类,而使用者仅仅只是想调用一下静态方法,而不使用单子实例,这种情况下如果类一加载(因我要用其静态方法)实例就创建,而我又自始至终没使用这个单子实例,那么它所占用的堆内存就白白浪费掉了,如果这样的类很多(JRE类库中就有很多),那么浪费的内存空间会很可观的。虽然 java.lang.Math 类没使用单子模式,但它的静态方法 random() 与此情况类似,可以参考一下它的源代码。
一方面我们希望就5个实例,一方面java又自动销毁。
java的垃圾回收是在该对象不可达的状况下进行的,也就是说该对象无用了,java垃圾回收装置才会在一个不定的时间来回收.关于对象池的内容请参考
http://java.chinaitlab.com/advance/731726.html
问题虽然结束,但学习还没有结束。谢谢大家。
我理解singleton是一种设计模式,跟static不是一个层面上的东西。
public class Singleton { private static Singleton s = null; private Singleton() { } public static getInstance() {
if (s == null) s = new Singleton();
return s;
}}//需要更证为如下:public class Singleton { private static Singleton s = null;
static Singleton()
{
s = new Singleton();} private Singleton() { } public static getInstance() {
if (s == null) s = new Singleton();
return s;
}}
多数人都是用的 SingleTone,我想来想去觉得Ststic也一样,代码简单的多了。
不过做了一段时间,我觉得大厅和聊天,下棋局面这样需要享元模式的地方特别多,采用Ststic是不用面向对象的方式,会造成逻辑混乱,修改全局变量的地方比较多。
如果采用SingleTone,每次修改的是对象,而不是全局变量,相对来说做游戏大厅这样全局的东东特别多的系统,还是SingleTone比较好。
简单的聊天,单个的小程序,我是觉得都一样的。因为SingleTone的本质就是Ststic。
这个问题就好比讨论面向对象好还是面向过程好一样。
或者是面向对象到什么地步的问题。
singleton是一种模式, 需要开发者去实现,通过stastic去实现它是其中一种方式而已.
static和singleton都没有对同步的要求.
class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {};
public Singleton getInstance() {
if(uniqueInstance == null) {
synchronized(Singleton.class) {
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}