首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

java关于单例模式的一些疑点

2012-11-18 
java关于单例模式的一些疑问???? 小弟最近想学习java的设计模式,就从单例模式来学起吧。大家知道在java语言

java关于单例模式的一些疑问?

??? 小弟最近想学习java的设计模式,就从单例模式来学起吧。大家知道在java语言中,可以利用static关键字来构建单例模式,主要是因为static这个关键字在所在的类在被java虚拟机装载的时候,变量是最先被装载(如果有多个,那么按照从上往下的顺序执行的),并且是全局共享的。

??? 因此:按照这个理解:我写了一个单例模式。代码如下:

??? public class Test{
??? private static Test test=null;
????public static Test getInstence(){

??????????????? ?if(test==null)
?????????????? ?{
???????????????????? test=mew Test();
????????????? ??}
???????????????? ?return test;

??????}
?? }

?????? 在这个方法里,我申明了一个private static类型的成员变量,然后申明了一个static类型的方法,判断test如果是null,则实例化,然后返回Test类的一个实例。应为static类型的变量是全局共享的,所以,一旦test被实例化,那么则被存放到java虚拟机的堆中,全局共享,以后不会在实例化。直到类的生命周期结束然后才会被销毁。在别的类要引用的时候,只需要Test.getInstence()就可以获得一个实例。这就是我理解的单利模式。

?

??? 但我在网上看了另一种写法,说要有一个私有的构造函数,代码是这样的。

??
? public class Test{
???? ?private Test(){}

????? private static Test test=new Test();

????? public static Test getInstence(){?
??
?????????return test;
??????

?????? }
??}

我是这样理解这个类的:

?1??? private static Test test=new Test();在jvm 装载这个类的时候会初始化这个声明,Test类的实例test已经被实例化。并且全局共享。

?2???? public static Test getInstence(){?
??
?????????return test;
??????

?????? }

? static的方法getInstence用来返回Test 类的实例。这个实例就是上面已经实例化的那个(唯一的一个)

?问题一:问题是私有的构造函数,我不明白为什么一定要有个私有的构造函数?大家帮? 忙看看!

?问题二:在开发单例模式中有那些是需要注意的地方?比如构造方法之类的要注意什 么?

?问题三:单利模式有几种形式?能不能给个例子?听说有懒汉式什么的?

问题四:什么时候需要用到单例模式?

????? 请大家不宁赐教!多谢!我的邮箱lifeneedyou@163.com,可以发邮件给我!

?

?

40 楼 tangshd 2009-04-28   C_J 写道tangshd 写道本来不想注册 写道Constructor的用法 和 static 的用法,如果不熟悉,可以用单例模式来加深对他们的理解。

单例模式的写法有很多吧,最简洁的才是最好的。

一个实例,虽然节约资源,缺点应该也很明显。就好比,厕所小便槽就一个,大家要排队等候。



兄台,您这个比喻好像不对吧..单例又不是单线程!

[b]所有线程都共享一个资源

一个线程共享所有资源[/b]

要是“资源”是马桶,排队的就是“线程”。

兄台为什么认为那位兄台比喻不对呢??
我同意 "所有线程都共享一个资源"这个观点, 我不认可的是 拿到"单例对象"后的其他操作的时候,不应该是排队等待,应该是竞争,当然这个操作是在没有加锁的情况下. 41 楼 dopic 2009-04-29   public static XXX getInstance (){
   if(XXX==null){
       synchronized(this){
         XXX = new XXX();
         }
    }
return XXX;
}
Head First设计模式上的 42 楼 dopic 2009-04-29   java 1.2 singleton时构造行数为private时,java内存回收时,会被回收掉的 43 楼 chenhua_1984 2009-04-29   dopic 写道public static XXX getInstance (){
   if(XXX==null){
       synchronized(this){
         XXX = new XXX();
         }
    }
return XXX;
}
Head First设计模式上的
谢谢!synchronized(this),这里的this具体怎么解释? 44 楼 C_J 2009-04-29   对象互斥

不过我觉得有问题

不是

  synchronized(Class.yourClass){
...
}

么????? 45 楼 iaimstar 2009-04-29   chenhua_1984 写道
谢谢!synchronized(this),这里的this具体怎么解释?
对象锁,对象锁被某个线程拿到后,其他的线程不能访问该资源,直到该对象锁被释放,也可以叫同步锁。 46 楼 iaimstar 2009-04-29   C_J 写道对象互斥

不过我觉得有问题

不是

  synchronized(Class.yourClass){
...
}

么?????
括号内的可以是任何对象,包括String,Class对象,你自己声明个object也没有问题,前提是该对象锁能确保不被其他线程所持有 47 楼 hot66hot 2009-04-29   package corejava.exam;

public class SingletonFactory {
private static SingletonFactory factory;
private static Object classclick = SingletonFactory.class;

private SingletonFactory() {
}

public static SingletonFactory newInstance() {
synchronized (classclick) {
if (factory == null)
factory = new SingletonFactory();
}
return factory;
}
}
48 楼 hot66hot 2009-04-29   锁应该是不让两个程序同时实例化singleton对象
给本类的class描述对象加锁我觉得最简单有效
搂住请见设计模式一书。 49 楼 C_J 2009-04-29   iaimstar 写道C_J 写道对象互斥

不过我觉得有问题

不是

  synchronized(Class.yourClass){
...
}

么?????
括号内的可以是任何对象,包括String,Class对象,你自己声明个object也没有问题,前提是该对象锁能确保不被其他线程所持有

不是,我的意思是你有看到他的方法是static么?

static是在JVM加载的时候就加载到静态去了

而这里的this的语义是"对象".
所以这里应该锁的是“类” 而非“对象”
所以我认为这里不应该是this. 50 楼 C_J 2009-04-29   hot66hot 写道锁应该是不让两个程序同时实例化singleton对象
给本类的class描述对象加锁我觉得最简单有效
搂住请见设计模式一书。


你的措词就有问题,  怎么可能是“程序”,汗

51 楼 binlaniua 2009-04-30   public static Singleton getInstance{
    if(singleton == null){
        synchronized(this){
           if(singlenton == null){
              singlenton = new Singlenton();
            }
         }
    }
    return singleton;
}
-----------------------------
这个性能比在外面加synchronized好多了
太精辟了 52 楼 tianlihu 2009-05-06   binlaniua 写道public static Singleton getInstance{
    if(singleton == null){
        synchronized(this){
           if(singlenton == null){
              singlenton = new Singlenton();
            }
         }
    }
    return singleton;
}
-----------------------------
这个性能比在外面加synchronized好多了
太精辟了
这个程序编译得过去吗? 应该改成synchronized(Singlenton.class) 53 楼 C_J 2009-05-06   本身就有问题~ 54 楼 gaobo 2009-05-06   我就说说我的理解吧:
问题一:声明私有的构造函数,是为了防止被其他类调用,否则的话,单例就不成立了。
问题二:开发单例的时候,主要是注意线程安全,即要保证在多线程运行的情况下,也不会发生线程同时访问一个变量的情况,所以,一般可以考虑为方法加"sychronized".
问题三:单例模式我知道的有懒汉式,和饱汉式。
问题四:这个还没有完全理解。 55 楼 wanglei50065842 2009-05-09   public class UserService {
private static final UserService userService = new UserService ();
private UserService{

}
public static UserService getInstance(){
return userService;
}
}
这个是懒汉式吧。。
采用的是预先加载的方式,UserService.class  当被载入的时候 就事先声明了对象; 56 楼 wanglei50065842 2009-05-09   chenhua_1984 写道dopic 写道public static XXX getInstance (){
   if(XXX==null){
       synchronized(this){
         XXX = new XXX();
         }
    }
return XXX;
}
Head First设计模式上的
谢谢!synchronized(this),这里的this具体怎么解释?


this  代表的是 XXX.class 57 楼 C_J 2009-05-12   wanglei50065842 写道chenhua_1984 写道dopic 写道public static XXX getInstance (){
   if(XXX==null){
       synchronized(this){
         XXX = new XXX();
         }
    }
return XXX;
}
Head First设计模式上的
谢谢!synchronized(this),这里的this具体怎么解释?


this  代表的是 XXX.class

晕 this是实例  XXX.class 是static类型 怎么可能相同 58 楼 dopic 2009-05-15   private static Object ob = new Object();
sorry 这里应该是个对象
synchronized(ob){
...
}
59 楼 dopic 2009-05-15   大家快自吻吧!都是我的错。没想当起了这么大反应,headfrist 在单例那一章写得很细,写了好几种单例,对每种单例都说明了各个的优缺点!

热点排行