zoukankan      html  css  js  c++  java
  • Java单例设计模式

     懒汉式参考:http://blog.csdn.net/haitaofeiyang/article/details/44124375

    没有使用单例模式:

    package java_basic;
    class Singleton{
    	public Singleton(){																	
    	}
    	
    	public void print(){
    		System.out.println("Hello Word");
    	}
    }
    
    public class singleton {
    
    	public static void main(String[] args) {
    		// TODO 自动生成的方法存根
    		Singleton s1 = new Singleton();
    		Singleton s2 = new Singleton();
    		Singleton s3 = new Singleton();
    		System.out.println(s1.hashCode());
    		System.out.println(s2.hashCode());
    		System.out.println(s3.hashCode());
    		s1.print();
    		s2.print();
    		s3.print();
    	}
    
    }
    

     

    单例设计模式:
    1):饿汉式:(一定是安全的,只有一份对象)
    1.构造器私有化
    2.声明私有的静态属性,同时创建该对象
    3.对外提供访问属性的静态方法,确保该对象存在。

    (1):写法:初始化就加载

    package java_basic;
    class Singleton{
    	private static Singleton instance = new Singleton();	//声明私有的静态属性,同时创建该对象
    	private Singleton(){					//构造函数私有化
    	}
    	
    	public static Singleton getInstance(){			//对外提供访问属性的静态方法,确保该对象存在
    		return instance;
    	}
    	
    	public void print(){
    		System.out.println("Hello Word");
    	}
    }
    
    
    public class singleton {
    
    	public static void main(String[] args) {
    		// TODO 自动生成的方法存根
    		Singleton s1 = Singleton.getInstance();
    		Singleton s2 = Singleton.getInstance();
    		Singleton s3 = Singleton.getInstance();
    		System.out.println(s1.hashCode());
    		System.out.println(s2.hashCode());
    		System.out.println(s3.hashCode());
    		s1.print();
    		s2.print();
    		s3.print();
    	}
    
    }
    

     可以看到输出的hashCode只有一个,证明new出的对象是同一个

    (2):写法:类在使用的时候加载,延时加载

    package java_basic;
    
    class Singleton{
    	//类在使用的时候加载,延时加载 
    	private static class Single{  
    		private static Singleton instance = new Singleton();  //声明私有的静态属性,同时创建该对象
    	}
    
    	private Singleton(){					//构造函数私有化
    	}
    	
    	public static Singleton getInstance(){			//对外提供访问属性的静态方法,确保该对象存在
    		return Single.instance;
    	}
    	
    	public void print(){
    		System.out.println("Hello Word");
    	}
    }
    
    
    public class singleton {
    
    	public static void main(String[] args) {
    		// TODO 自动生成的方法存根
    		Singleton s1 = Singleton.getInstance();
    		Singleton s2 = Singleton.getInstance();
    		Singleton s3 = Singleton.getInstance();
    		System.out.println(s1.hashCode());
    		System.out.println(s2.hashCode());
    		System.out.println(s3.hashCode());
    		s1.print();
    		s2.print();
    		s3.print();
    	}
    
    }
    

     

    单例设计模式:
    2):懒汉式:(不一定安全,确保只有一份对象需要synchronized)
    1.构造器私有化
    2.声明私有的静态属性
    3.对外提供访问属性的静态方法,确保该对象存在。
    (1):写法,多线程下不安全

    package java_basic;
    
    class Singleton{		//懒汉模式,多线程下不安全
    	private static Singleton instance;	//声明私有的静态属性,但是不创建该对象
    	private Singleton(){			//构造函数私有化
    	}
    	
    	public static Singleton getInstance(){	//对外提供访问属性的静态方法,确保该对象存在
    		 if(instance == null){  
    	            instance = new Singleton();  
    	        }  
    		return instance;
    	}
    	
    	public void print(){
    		System.out.println("Hello Word");
    	}
    }
    
    public class singleton {
    
    	public static void main(String[] args) {
    		// TODO 自动生成的方法存根
    		Singleton s1 = Singleton.getInstance();
    		Singleton s2 = Singleton.getInstance();
    		Singleton s3 = Singleton.getInstance();
    		System.out.println(s1.hashCode());
    		System.out.println(s2.hashCode());
    		System.out.println(s3.hashCode());
    		s1.print();
    		s2.print();
    		s3.print();
    	}
    
    }
    

     

    (2):写法,加锁

    package java_basic;
    
    class Singleton{		//懒汉模式,加锁
    	private static Singleton instance;	//声明私有的静态属性,但是不创建该对象
    	private Singleton(){			//构造函数私有化
    	}
    	
    	public static Singleton getInstance(){	//对外提供访问属性的静态方法,确保该对象存在
    		if(instance == null){  
    			synchronized(Singleton.class){//加锁
    				if(null == instance){
    					instance = new Singleton();  
    				}
    			}
    		}  
    		return instance;
    	}
    	
    	public void print(){
    		System.out.println("Hello Word");
    	}
    }
    
    public class singleton {
    
    	public static void main(String[] args) {
    		// TODO 自动生成的方法存根
    		Singleton s1 = Singleton.getInstance();
    		Singleton s2 = Singleton.getInstance();
    		Singleton s3 = Singleton.getInstance();
    		System.out.println(s1.hashCode());
    		System.out.println(s2.hashCode());
    		System.out.println(s3.hashCode());
    		s1.print();
    		s2.print();
    		s3.print();
    	}
    
    }
    
  • 相关阅读:
    [转]SQLSERVER 18056 错误
    【转】 Windows控制台上的UTF8支持
    无法访问共享解决方案之一
    performselectoronmainthread
    iphone开发多线程
    iPad app应用开发系列文章之三 -- iOS的多核编程和内存管理
    ObjectiveC中一种消息处理方法performSelector: withObject:
    UIView你知道多少
    NSBundle介绍
    Blocks,注意
  • 原文地址:https://www.cnblogs.com/tonglin0325/p/5196818.html
Copyright © 2011-2022 走看看