欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java单例模式,

来源: javaer 分享于  点击 39683 次 点评:259

java单例模式,




概念:

      java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例

      单例模式有以下特点:

      1.单例类只能有一个实例

      2.单例类必须自己创建自己的唯一实例

      3.单例类必须给所有其他对象提供这一实例

      单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,

线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或

少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个

打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当几种管理这些通信端口,以

避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

      经典的单例实现

  public class Singleton{

          private static Singleton single = null;

         private Singleton(){

            //Exist only to default instantiation

         }

       public static Singleton getInstance(){

           if(single == null){

                  single = new Singleton();

              }

             return single;

         }

       //other methods

}

       Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的

唯一实例只能通过getInstance()方法访问。(事实上,通过java反射机制是能够实例化构造方法为private的类的

,那基本上会使所有的java单例实现失效。)

        但是以上实现没有考虑到线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程同时

运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行结果是一样的,而且其它的变量的

值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者

多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上的实现

并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。


/*验证单例模式的例子*/

package singleton;

public class Singleton {
     private String name;
     private static Singleton single = null;
     private Singleton(){
     }
     public static Singleton getSingleton(){
    	 if(single == null){
    		 single = new Singleton();
    	 }
    	 return single;
     }
     
     public void message(){
    	 System.out.println("message:" + this.name);
     }
     
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
     
}

package singleton;

public class TestSingle {
     public static void main(String[] args) {
		Singleton s1 = Singleton.getSingleton();
		s1.setName("张三    1");
		System.out.println(s1.getName());
		Singleton s2 = Singleton.getSingleton();
		s2.setName("张三  2");
		System.out.println(s2.getName());
		
		s1.message();
		s2.message();
		if(s1 == s2){
			System.out.println("创建的是同一个实例");
		}else{
			System.out.println("创建的不是同一个实例");
		}
	}
}

运行结果如下:

张三    1
张三  2
message:张三  2
message:张三  2
创建的是同一个实例



相关文章

    暂无相关文章
相关栏目:

用户点评