`
chenhua_1984
  • 浏览: 1253843 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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 ,可以发邮件给我!

 

 

分享到:
评论
59 楼 dopic 2009-05-15  
大家快自吻吧!都是我的错。没想当起了这么大反应,headfrist 在单例那一章写得很细,写了好几种单例,对每种单例都说明了各个的优缺点!
58 楼 dopic 2009-05-15  
private static Object ob = new Object();
sorry 这里应该是个对象
synchronized(ob){
...
}
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类型 怎么可能相同
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
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  当被载入的时候 就事先声明了对象;
54 楼 gaobo 2009-05-06  
我就说说我的理解吧:
问题一:声明私有的构造函数,是为了防止被其他类调用,否则的话,单例就不成立了。
问题二:开发单例的时候,主要是注意线程安全,即要保证在多线程运行的情况下,也不会发生线程同时访问一个变量的情况,所以,一般可以考虑为方法加"sychronized".
问题三:单例模式我知道的有懒汉式,和饱汉式。
问题四:这个还没有完全理解。
53 楼 C_J 2009-05-06  
本身就有问题~
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)
51 楼 binlaniua 2009-04-30  
public static Singleton getInstance{
    if(singleton == null){
        synchronized(this){
           if(singlenton == null){
              singlenton = new Singlenton();
            }
         }
    }
    return singleton;
}
-----------------------------
这个性能比在外面加synchronized好多了
太精辟了
50 楼 C_J 2009-04-29  
hot66hot 写道
锁应该是不让两个程序同时实例化singleton对象
给本类的class描述对象加锁我觉得最简单有效
搂住请见设计模式一书。



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

49 楼 C_J 2009-04-29  
iaimstar 写道
C_J 写道
对象互斥

不过我觉得有问题

不是

  synchronized(Class.yourClass){
...
}

么?????

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


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

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

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

不过我觉得有问题

不是

  synchronized(Class.yourClass){
...
}

么?????

括号内的可以是任何对象,包括String,Class对象,你自己声明个object也没有问题,前提是该对象锁能确保不被其他线程所持有
45 楼 iaimstar 2009-04-29  
chenhua_1984 写道

谢谢!synchronized(this),这里的this具体怎么解释?

对象锁,对象锁被某个线程拿到后,其他的线程不能访问该资源,直到该对象锁被释放,也可以叫同步锁。
44 楼 C_J 2009-04-29  
对象互斥

不过我觉得有问题

不是

  synchronized(Class.yourClass){
...
}

么?????
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具体怎么解释?
42 楼 dopic 2009-04-29  
java 1.2 singleton时构造行数为private时,java内存回收时,会被回收掉的
41 楼 dopic 2009-04-29  
public static XXX getInstance (){
   if(XXX==null){
       synchronized(this){
         XXX = new XXX();
         }
    }
return XXX;
}
Head First设计模式上的
40 楼 tangshd 2009-04-28  
C_J 写道
tangshd 写道
本来不想注册 写道
Constructor的用法 和 static 的用法,如果不熟悉,可以用单例模式来加深对他们的理解。

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

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



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


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

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

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

兄台为什么认为那位兄台比喻不对呢??

我同意 "所有线程都共享一个资源"这个观点, 我不认可的是 拿到"单例对象"后的其他操作的时候,不应该是排队等待,应该是竞争,当然这个操作是在没有加锁的情况下.

相关推荐

    图解Java单例模式内存分配

    1:虚拟机加载StaticDemo类,保存类型信息到方法区。...  (1)装载,通过类的全名产生对应类的二进制数据流,分析二进制数据流并转换为方法区特定的数据结构,创建对应类的java.lang.Class实例。  (2)链

    西农java实验题

    8. **设计模式**:学习常见的设计模式,如单例模式、工厂模式、观察者模式等,提高代码的可复用性和可维护性。 9. **JDBC数据库操作**:使用Java连接数据库,执行SQL语句,处理结果集。 10. **Java标准库**:熟悉...

    二十三种设计模式【PDF版】

    关于本站“设计模式” Java 提供了丰富的 API,同时又有强大的数据库系统作底层支持,那么我们的编程似乎变成了类似积木的简单"拼凑"和调用, 甚至有人提倡"蓝领程序员",这些都是对现代编程技术的不了解所至. 在...

    Java实验报告及源码

    11. **设计模式**:报告可能涵盖了常见的设计模式,如单例、工厂、观察者模式等,并通过源代码展示了它们在实际项目中的应用。 12. **源代码**:提供的源程序代码是理解和学习Java编程的重要资源,每个文件名可能...

    java学习的全部收藏资料

    3. **设计模式与架构**: 学习常见的设计模式(如工厂模式、单例模式、观察者模式等)和软件架构原则,可以提升代码质量和系统的可维护性。 4. **高级特性**: 包括泛型、反射、注解、枚举、并发编程等,这些都是...

    java源码个人网上银行系统(javase)

    2. **面向对象编程**:深入理解类的设计,包括属性、方法、构造器以及类之间的关系,如单例模式、工厂模式等设计模式的应用。 3. **异常处理**:理解和使用try-catch-finally语句块来捕获和处理程序运行时可能出现...

    java 高级理论-7

    3. **设计模式**:Java中常见的设计模式如单例模式、工厂模式、观察者模式等,是解决常见软件工程问题的通用解决方案。掌握这些模式能提高代码质量和可维护性。 4. **反射机制**:Java反射允许程序在运行时检查类的...

    JAVA实战学习.zip

    13. **设计模式**:在JAVA开发中,设计模式是解决常见问题的最佳实践,如单例模式、工厂模式、观察者模式等,它们提供了可复用的解决方案。 14. **JVM(Java Virtual Machine)**:JAVA程序通过JVM运行,理解JVM的...

    Java个人简历代码

    【Java个人简历代码】是一个关于Java编程语言的项目,它包含了一组代码示例,用于展示个人在Java领域的技能和经验。这个项目可能是为求职者准备的,以便他们在面试或应聘时能展示自己的编程能力。729832422可能是...

    Java工程师成神之路.zip

    8. 设计模式:单例、工厂、观察者等常见设计模式的应用。 9. Java高级特性:Lambda表达式、Stream API、反射等。 作者微信.docx 这可能是一个联系方式文档,作者可能通过微信分享更多的学习资源、解答疑问或建立...

    有关Java的例子(源码)

    10. **设计模式**:在提供的源码中,可能还会发现一些常见的设计模式,如工厂模式、单例模式、观察者模式等,这些都是解决特定问题的通用解决方案。 通过分析和学习这些例子,开发者不仅可以理解Java的基本概念,还...

    一款五子棋小游戏,基于JAVA语言编写。.zip

    8. **设计模式**:为了使代码更易维护和扩展,开发者可能会应用一些设计模式,如单例模式(用于控制资源的唯一性),工厂模式(用于创建对象)或者观察者模式(用于实现事件监听)。 9. **编译与运行**:Java程序...

    java 编程 经典案例集锦

    11. **设计模式**:这些案例可能包含了常见的设计模式,如工厂模式、单例模式、观察者模式、装饰器模式等,这些都是解决特定问题的标准化解决方案,学习者可以通过实践加深对设计模式的理解。 12. **Swing或JavaFX...

    java编写的小的学生信息管理系统

    - **代码结构**:遵循良好的编程规范,使用面向对象的设计模式,如单例模式、工厂模式等,提高代码的可读性和可维护性。 在“小学生管理系统”这个压缩包中,包含了整个项目的源代码和可能的数据库文件。初学者可以...

    java 五子棋项目

    9. **设计模式**:在编写复杂软件系统时,设计模式如单例模式、工厂模式等可以帮助提高代码的可读性和可维护性。开发者可能在项目中应用了这些模式。 10. **版本控制**:项目可能使用Git进行版本管理,通过提交和...

    北邮电子院java作业

    11. **设计模式**:可能会有一些基础的设计模式应用,如单例模式、工厂模式等。 12. **单元测试**:JUnit的使用,进行代码测试以确保其正确性。 13. **图形用户界面(GUI)**:可能涉及到Swing或JavaFX库,用于...

    Java笔记与作业

    1. **设计模式**:单例模式、工厂模式、装饰器模式等常见设计模式的实现。 2. **文件操作**:读取、写入文件,目录操作,文件复制。 3. **多线程**:线程的创建,同步机制(synchronized,wait(),notify()),...

    java学习笔记2

    14. **设计模式**:学习常见的设计模式,如单例模式、工厂模式、观察者模式等,提高代码的可读性和可维护性。 如果压缩包内的"video1"代表视频教程,那么这部分可能包含了讲解上述概念的视觉演示,使得学习更加直观...

    java大学程序设计和java大学基础教程的例子---缺的---ch14

    9. **设计模式**:设计模式是软件开发中的最佳实践,第14章可能介绍一些常见的设计模式,如单例、工厂、观察者、装饰者、适配器等,并讲解如何在Java中应用它们。 10. **JavaFX或Swing图形用户界面**:如果教程覆盖...

Global site tag (gtag.js) - Google Analytics