`
wangchao_17915566
  • 浏览: 169490 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

学习单例模式

阅读更多

看了下单例模式,个人理解就是只能有一此实例化,这样对性能有一定提高。

下面说说学习小例子:

public class Singleton {
		private Singleton(){}
		private static Singleton instance = new Singleton();
		public static Singleton getInstance(){
			return instance;
		}
		public void sys(String s){
			System.out.println(s+"singleton.........");
		}
}

 

此类就是一个单例类,里面我写了一个方法

测试此类:

public class TestSingletion {

	public static void main(String args[]){

		Singleton.getInstance().sys("fdsfds");
	}
}

 

只能通过Singleton.getInstance()得到实例,调用类中方法。

这就是一个单例模式。

 

网上还有一种方法是:

public class Singleton { 
 private static Singleton instance = null;
 private Singleton(){
  //应该加上这个
 }
 public static synchronized Singleton getInstance(){
  if(instance==null){
    instance = new Singleton();
  }
  return instance;
 }
 public void sys(String s){
  System.out.println(s+"singleton.........");
 }
}

 网上说可以这样可以防止多个实例。

而我用测试类进行测试时,却可以实例化此类,不知道为何,谢谢能有人讨论下。

 

在各位的帮助下,我知道错了,谢谢

 

分享到:
评论
35 楼 aishangtao 2009-01-01  
构造器一定要私有化。
34 楼 Burce Cai 2008-12-27  
个人对使用synchronized的看法是诚然他可能会减低你的程序性能,但使用不使用应该看你的软件的需要而定。软件开发受各种因素(安全、性能等)影响,有时候不能要了性能就丢了安全性,所以就解决方案来说没有最好,只有最适合。

话说回来,单件模式多数情况下解决的是控制一组共享资源的问题,在多线程对资源进行结构性修改的情况下要保证程序正常运行,急切模式是不错的,但有时候又偏偏不想或不能让类被过早的实例化,那使用延迟实例化或双重检验加锁模式也是可以考虑的。
33 楼 Burce Cai 2008-12-27  
第一个例子是急切模式,第二个是延迟实例化模式,还有一种双重检验加锁模式(对第二个的优化)
public class Singleton {//volatile在早前版本的实现中会导致双重检验加锁的
                        //失败,故请使用java 5及更新的版本
private volatile static Singleton uniqueInstance;
private Singleton(){}

public static Singleton getInstance(){
if(uniqueInstance == null){
synchronized(Singleton.class){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
32 楼 liouys 2008-12-20  
nairuo1988 写道
第一个是单线程下,在多线程下为防止并发访问导致实例化2个出来,要用第2个,更好的方法是:
  public static Singleton getInstance(){
     if(instance == null)
         synchronized(Singleton.Class){
             if(instance == null)
                 instance = new Singleton();
         }
     }
     return instance;
}

双重检查加锁,只在第一次调用getInstance()时才要同步,提高性能



我在《Head First设计模式》这本书上看到过这种。那上面写了三种。
1.如果getInstance()的性能对应用程序不是很关键,就什么都别做。
2.使用‘急切’创建实例,而不用延迟实例化的做法。
3.就是上面这种。用‘双重检查加锁’,在getInstance()中减少使用同步。
31 楼 yunhaifeiwu 2008-12-19  
xieke 写道
yunhaifeiwu 写道
nairuo1988 写道
第一个是单线程下,在多线程下为防止并发访问导致实例化2个出来,要用第2个,更好的方法是:
  public static Singleton getInstance(){
     if(instance == null)
         synchronized(Singleton.Class){
             if(instance == null)
                 instance = new Singleton();
         }
     }
     return instance;
}

双重检查加锁,只在第一次调用getInstance()时才要同步,提高性能


打板子!看我发的网址,有多线程下,大多数单例模式的应用进行了测试与介绍。如果有兴趣,自已照他的方法检查你的双重检查加锁吧!


你发的网址在那里?感觉她写的没问题啊

http://www.iteye.com/topic/60179
30 楼 xieke 2008-12-19  
yunhaifeiwu 写道
nairuo1988 写道
第一个是单线程下,在多线程下为防止并发访问导致实例化2个出来,要用第2个,更好的方法是:
  public static Singleton getInstance(){
     if(instance == null)
         synchronized(Singleton.Class){
             if(instance == null)
                 instance = new Singleton();
         }
     }
     return instance;
}

双重检查加锁,只在第一次调用getInstance()时才要同步,提高性能


打板子!看我发的网址,有多线程下,大多数单例模式的应用进行了测试与介绍。如果有兴趣,自已照他的方法检查你的双重检查加锁吧!


你发的网址在那里?感觉她写的没问题啊
29 楼 yunhaifeiwu 2008-12-09  
网上还有一种方法是:
Java代码
public class Singleton {  
private static Singleton instance = null; 
private Singleton(){ 
  //应该加上这个 

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

public void sys(String s){ 
  System.out.println(s+"singleton........."); 


网上说可以这样可以防止多个实例。
而我用测试类进行测试时,却可以实例化此类,不知道为何,谢谢能有人讨论下。

=====================
正想说,才发现被人已经说了。楼主这里的构造函数没指出,在java中,缺省就意味着有一公有的构造函数。
28 楼 yunhaifeiwu 2008-12-08  
nairuo1988 写道
第一个是单线程下,在多线程下为防止并发访问导致实例化2个出来,要用第2个,更好的方法是:
  public static Singleton getInstance(){
     if(instance == null)
         synchronized(Singleton.Class){
             if(instance == null)
                 instance = new Singleton();
         }
     }
     return instance;
}

双重检查加锁,只在第一次调用getInstance()时才要同步,提高性能


打板子!看我发的网址,有多线程下,大多数单例模式的应用进行了测试与介绍。如果有兴趣,自已照他的方法检查你的双重检查加锁吧!
27 楼 nairuo1988 2008-12-08  
第一个是单线程下,在多线程下为防止并发访问导致实例化2个出来,要用第2个,更好的方法是:
  public static Singleton getInstance(){
     if(instance == null)
         synchronized(Singleton.Class){
             if(instance == null)
                 instance = new Singleton();
         }
     }
     return instance;
}

双重检查加锁,只在第一次调用getInstance()时才要同步,提高性能
26 楼 xiaofei_suman 2008-12-08  
学习,大家都很厉害,都是榜样呀,努力!
25 楼 zhxy0234 2008-12-07  
单例模式,学习了。
24 楼 wanghualeilei 2008-12-06  
防止在对象构造过程中,也就是构造函数执行过程中,被其他线程抢占,从而产生第二个对象
23 楼 daweiangel 2008-12-05  
xin911 写道
很典型的 饿汉,懒汉式单例类吧
public class Singleton {  
 
    private static final Singleton s = new Singleton();  
 
    private Singleton() {  
    }  
 
    public static Singleton getInstance() {  
        return s;  
    }  
}

说是更符合java面向对象语言特点--推荐

推荐
22 楼 wangchao_17915566 2008-12-05  
yunhaifeiwu 写道

对了,发现javaeye的圈子没有这类似的机制,人群也较多!在javaeye中,论坛潜规则是给高手过招的地方!(仔细读版规,琢磨一下)

一个人和一个人理解不一样,我理解的javaeye也许跟你琢磨的不是很一样,不好意思哦。
21 楼 yunhaifeiwu 2008-12-04  
对了,发现javaeye的圈子没有这类似的机制,人群也较多!

在javaeye中,论坛潜规则是给高手过招的地方!(仔细读版规,琢磨一下)
20 楼 yunhaifeiwu 2008-12-04  
wangchao_17915566 写道
netfork 写道
哎,管理员在哪里啊~~~
发现只要不是纯技术问题,均可以在论坛(非入门版)里混~

我觉得此人思想有点..每个人都是从不懂-学习-懂,为什么我以我的方式理解>的东西不能写出来,最起码我是用心写的,你找管理员干嘛?难道我自己总结下干扰你了


在javaeye中,你不能发这种东东的!你就是再用心写,就算你能给更多人与启迪参考与帮助都不能。

在你发的文中不能有明显的牛人们能发现的错误!

正确的做法是:把你的真正的内容放到blog或其他网站中,然后发一个说明,一个效果图,OK!然后别在论坛里讨论!

要讨论,一定要讨论高质量的东东!

在javaeye中,像你类讨论,只配新手区!(不好意思,这是教训!像你这种待遇我已经习惯了。)
19 楼 chan.d 2008-12-04  
呵呵,这样的文章也上首页喔~~

怀疑JavaEye的水平了喔,开玩笑呵呵
18 楼 xin911 2008-12-03  
很典型的 饿汉,懒汉式单例类吧
public class Singleton {  
 
    private static final Singleton s = new Singleton();  
 
    private Singleton() {  
    }  
 
    public static Singleton getInstance() {  
        return s;  
    }  
}

说是更符合java面向对象语言特点--推荐
17 楼 puroc 2008-12-03  
使用synchronized是避免在多个线程同时访问getInstance方法时,会返回两个实例。现在一般不在方法上加synchronized,一般在getInstantce里面加,并且使用双check,以避免第二次调用getInstantce方法时,不会再进入synchronized里面。这种方式属于lazy Initialize

但我的写法如下,不是lazy的:

public class Singleton {

    private static final Singleton s = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return s;
    }
}


前一阵JavaEye还有一个帖子,说一个老外推荐了一种singleton的写法。你可以找找那个帖子。
16 楼 hanjs 2008-12-03  
如果看过双单子,也不能避免存在多个实例。


还是感觉第一种实现适合java,而且也已经能达到目的了。

静态的肯定是只编译一次的,应该不会存在两个吧。

相关推荐

    设计模式——单例

    在学习单例模式时,除了理解其基本概念和实现,还需要关注如何在实际项目中正确、恰当地应用。通过阅读提供的"iOS 设计模式——单例"相关资料,可以深入理解在iOS开发环境中如何有效利用单例模式来优化代码结构和...

    java设计模式

    通过学习单例模式,可以更好地理解和掌握如何在Java程序中控制对象的创建,提高代码的复用性和性能。 设计模式不仅仅是关于代码结构,更重要的是理解其背后的意图和解决问题的思路。学习设计模式有助于提升编程思维...

    Mastering PHP Design Patterns_Code(pdf+mobi+epub+code_file).zip

    从基础到高级,读者可以逐步学习单例模式、工厂模式、观察者模式、装饰器模式、策略模式、代理模式等经典设计模式。每个章节都可能包含理论解释、代码示例以及实际应用场景,帮助读者将理论知识转化为实际编程技能。...

    详解单例模学习资料

    学习单例模式不仅仅是理解其基本概念,更重要的是要理解它在实际项目中的应用场景和限制。通过阅读这份"详解单例模学习资料",你将能够更好地掌握如何在Java项目中有效地使用单例模式,解决实际问题。同时,你也需要...

    JAVA程序员培训定制课程

    我们将会学习单例模式、工厂模式、观察者模式等经典模式,并了解它们在实际项目中的应用。 PPT标签可能意味着课程中会有演示文稿辅助教学,这些文稿通常包含关键概念的总结、示例代码以及课后练习,帮助学员更好地...

    毕向东静态06

    学习单例模式有助于理解对象的生命周期管理,以及在多线程环境下的资源控制。 在"黑马程序员_毕向东_Java基础视频教程第06天-09-面向对象(单例设计模式).avi" 这个文件中,毕向东老师可能会详细讲解以下内容: 1. ...

    潭州软件学院-javavip系统基础学习课程表 (1).docx

    学员还会学习单例模式,这是一种确保一个类只有一个实例的设计模式。同时,课程涵盖了类的继承、抽象类和接口的使用,讲解了`is-a`、`is-like-a`、`has-a`的关系,以及Object类的重要性。通过学习接口,学员能理解...

    张孝祥Java 就业培训教程(pdf版+源码)

    在面向对象的设计模式部分,教程会引导学员学习单例模式、工厂模式、观察者模式等常见的设计模式,这些都是在实际开发中经常用到的,能提升代码的可读性和可维护性。 当然,对于就业培训,实战项目经验至关重要。...

    U3D里的贪吃蛇教程

    在本教程中,我们将会学习如何使用...本教程的目标是提供一个易于理解的贪吃蛇游戏制作过程,让初学者能够通过编程在Unity中实现自己的游戏,并且通过学习单例模式和辅助脚本的使用,加深对C#编程和游戏设计的理解。

    java自学笔记

    - **常见设计模式**:学习单例模式、工厂模式、装饰者模式、观察者模式等经典设计模式的原理和应用。 6. Java EE - **Servlet与JSP**:理解Web开发的基础,如何编写Servlet和JSP页面。 - **MVC框架**:介绍...

    C#经典实例源码(198)

    - 学习单例模式、工厂模式、观察者模式等常见设计模式在WinForm应用中的应用。 通过这198个实例,开发者不仅可以熟悉C#语法,还能掌握WinForm应用开发的实战技巧。每一个实例都是一个独立的学习点,通过实践和调试...

    工作日每天一道前端大厂面试题

    13. **设计模式**:学习单例模式、工厂模式、观察者模式等经典设计模式,并理解其在JavaScript中的应用。 14. **浏览器兼容性**:理解不同浏览器之间的差异,以及如何使用polyfill或Babel进行代码转换,确保代码在...

    自己总结的java常用例题

    - 学习单例模式、工厂模式、装饰器模式、观察者模式等常见设计模式。 通过解决这些Java例题,你可以逐步巩固基础,提升编程技能,并为更高级的概念打下坚实的基础。不断地实践和应用,是成为一名优秀Java开发者的...

    java题目以及Java面试题和ASP.NET的技术题目java题目以及Java面试题和ASP.NET的技术题目java题目以及Java面试题和ASP.NET的技术题目

    - 学习单例模式、工厂模式、观察者模式等常见设计模式的原理和应用场景。 【ASP.NET技术题目】 ASP.NET是微软公司的Web应用程序开发框架,主要用于构建动态网站、Web应用和Web服务。以下是一些相关的知识点: 1....

    PHP技术文档

    5. 设计模式:学习单例模式、工厂模式、观察者模式等常见设计模式。 七、PHP框架与应用 介绍常见的PHP框架,如Laravel、Symfony、Yii等,理解框架的MVC模式,提高开发效率和代码质量。 八、性能优化与安全实践 1. ...

    java基础知识及技术

    学习单例模式、工厂模式、装饰器模式等基础设计模式,能提升代码质量和可维护性。 12. **单元测试与持续集成**:JUnit是Java中常用的单元测试框架,学习如何编写测试用例以及使用Maven或Gradle进行持续集成,可以...

    JAVA中单例模式的几种实现方式.doc

    为了保证单例模式在多线程环境下的正确性,可以在`getInstance()`方法上加上`synchronized`关键字,以确保同一时间只有一个线程能够执行该方法,从而避免创建多个实例。 ```java public class Singleton { private...

    java的课题有关题目的解析

    学习单例模式、工厂模式、观察者模式等常见设计模式,可以提高代码的可维护性和可扩展性。 12. **测试**:JUnit是Java的单元测试框架,学会编写测试用例和断言,确保代码的正确性,是良好编程习惯的一部分。 在...

    Kotlin语言教程&案例&相关项目资源

    - **对象(Object)**:学习单例模式,以及如何使用对象表达式和对象声明。 - **继承**:掌握继承机制,了解`open`关键字的作用。 - **多态**:通过接口和抽象类实现多态性。 - **伴生对象(Companion Object)**:学习...

Global site tag (gtag.js) - Google Analytics