锁定老帖子 主题:java关于单例模式的一些疑问?
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-12
最后修改:2009-04-16
小弟最近想学习java的设计模式,就从单例模式来学起吧。大家知道在java语言中,可以利用static 关键字来构建单例模式,主要是因为static 这个关键字在所在的类在被java虚拟机装载的时候,变量是最先被装载(如果有多个,那么按照从上往下的顺序执行的),并且是全局共享的。 因此:按照这个理解:我写了一个单例模式。代码如下: public class Test{ if(test==null) } 在这个方法里,我申明了一个private static类型的成员变量,然后申明了一个static类型的方法,判断test如果是null,则实例化,然后返回Test类的一个实例。应为static类型的变量是全局共享的,所以,一旦test被实例化,那么则被存放到java虚拟机的堆中,全局共享,以后不会在实例化。直到类的生命周期结束然后才会被销毁。在别的类要引用的时候,只需要Test.getInstence()就可以获得一个实例。这就是我理解的单利模式。
但我在网上看了另一种写法,说要有一个私有的构造函数,代码是这样的。 private static Test test=new Test(); public static
Test getInstence(){ } 我是这样理解这个类的: 1 private static Test test=new Test();在jvm 装载这个类的时候会初始化这个声明,Test类的实例test已经被实例化。并且全局共享。 2
public static
Test getInstence(){ }
static的方法getInstence用来返回Test 类的实例。这个实例就是上面已经实例化的那个(唯一的一个)
问题一:问题是私有的构造函数,我不明白为什么一定要有个私有的构造函数?大家帮 忙看看! 问题二:在开发单例模式中有那些是需要注意的地方?比如构造方法之类的要注意什 么?
问题三:单利模式有几种形式?能不能给个例子?听说有懒汉式什么的?
问题四:什么时候需要用到单例模式?
请大家不宁赐教!多谢!我的邮箱lifeneedyou@163.com
,可以发邮件给我!
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-04-12
Struts1.x的Action类的设计就是Singlenon
所有的request共享一个Action 所以要注意线程安全问题 单例可以节省资源 小生拙见!呵呵 |
|
返回顶楼 | |
发表时间:2009-04-12
……看看书吧 GoF23中对单例的说明很详细的吧- -
问题一:公开构造性,你还写个getInstance的方法,不很好笑吗- -;不一定要私有级的的,但起码是保护级的…… 问题二:getInstance方法按照你那个写法是线程不安全的,判断的时候加同步锁,参考head first上的几个例子 问题三:看书 问题四:你只有有一个实例,又不想他声明为一个全局变量时…… |
|
返回顶楼 | |
发表时间:2009-04-12
C_J 写道 Struts1.x的Action类的设计就是Singlenon 所有的request共享一个Action 所以要注意线程安全问题 单例可以节省资源 小生拙见!呵呵 谢谢你的关注!单例是可以节省资源。 |
|
返回顶楼 | |
发表时间:2009-04-12
akiraray 写道 ……看看书吧 GoF23中对单例的说明很详细的吧- -问题一:公开构造性,你还写个getInstance的方法,不很好笑吗- -;不一定要私有级的的,但起码是保护级的……问题二:getInstance方法按照你那个写法是线程不安全的,判断的时候加同步锁,参考head first上的几个例子问题三:看书问题四:你只有有一个实例,又不想他声明为一个全局变量时…… 多谢! |
|
返回顶楼 | |
发表时间:2009-04-12
akiraray 写道 ……看看书吧 GoF23中对单例的说明很详细的吧- -
问题一:公开构造性,你还写个getInstance的方法,不很好笑吗- -;不一定要私有级的的,但起码是保护级的…… 问题二:getInstance方法按照你那个写法是线程不安全的,判断的时候加同步锁,参考head first上的几个例子 问题三:看书 问题四:你只有有一个实例,又不想他声明为一个全局变量时…… 这里有必要做同步吗? 只是简单的if判断和返回static对象地址呀 |
|
返回顶楼 | |
发表时间:2009-04-12
最后修改:2009-04-12
“对象池”技术好像也用到单例,用于管理池中所有的对象
如: public class ObjectPoolFactory { private static ObjectPoolFactory objectPoolFactory; private ObjectPoolFactory() { } public ObjectPool createPool(ParameterObject paraObj, Class clsType) { return new ObjectPool(paraObj, clsType); } public static ObjectPoolFactory getInstance() { if (objectPoolFactory == null) { objectPoolFactory = new ObjectPoolFactory(); } return objectPoolFactory; } } 类似一个公司的CEO吧,因为CEO只有一个,然后管理下面所有人员! |
|
返回顶楼 | |
发表时间:2009-04-12
1构造函数有什么样的要求?
2这里的线程安全问题是怎么回事? |
|
返回顶楼 | |
发表时间:2009-04-12
最后修改:2009-04-12
chenhua_1984 写道 1构造函数有什么样的要求?
2这里的线程安全问题是怎么回事? 1.私有构造行数是禁止通过实例该类获得对象,如: new Test().getInstence(); 2.线程安全是指如果有多个线程,在第一个线程还没有执行到new Test()的时候,第二个线程调用该方法时判断test仍然为null,所以仍然会执行new Test()。 所以一般使用synchronized关键字将该方法声明成同步方法,如: public static synchronized Test getInstence |
|
返回顶楼 | |
发表时间:2009-04-12
longrui 写道 chenhua_1984 写道 1构造函数有什么样的要求?
2这里的线程安全问题是怎么回事? 1.私有构造行数是禁止通过实例该类获得对象,如: new Test().getInstence(); 2.线程安全是指如果有多个线程,在第一个线程还没有执行到new Test()的时候,第二个现成调用该方法时判断test仍然为null,所以仍然会执行new Test()。 所以一般使用synchronized关键字将该方法声明成同步方法,如: public static synchronized Test getInstence 非常感谢longrui!受教了! |
|
返回顶楼 | |