• java 单例的实现及多线程下的安全


    package com.demo01;
    
    public class Single {
    
    	/**
    	 * 设计模式:单例设计模式
    	 * 		解决一个类中只允许存在一个对象这种情况;
    	 * 		不允许通过类,无限制的创建该类的对象。
    	 * 	怎样实现单例模式?
    	 * 		构造函数私有化(private);
    	 * 		在当前类的内部,写一个方法创建出该类的对象;
    	 * 		对外提供公共的访问接口;
    	 * */
    	public static void main(String[] args) {
    		
    		
    		
    	}
    
    }
    /*
     * 枚举enum实现单例模式
     * 多线程下安全
     */
    class ClassFactory{   
        private enum MyEnumSingleton{  
            singletonFactory;  
              
            private MSingleton instance;  
              
            private MyEnumSingleton(){//枚举类的构造方法在类加载是被实例化  
                instance = new MSingleton();  
            }  
       
            public MSingleton getInstance(){  
                return instance;  
            }  
        }   
        public static MSingleton getInstance(){  
            return MyEnumSingleton.singletonFactory.getInstance();  
        }  
    }  
    //需要获实现单例的类,比如数据库连接Connection  
    class MSingleton{
        public MSingleton(){}   
    } 
    
    
    
    
    /*
     * 内部类方式实现单例
     * 多线程是安全
     */
    
     class MySingleton {  
        
        //静态内部类  
        private static class MySingletonHandler{  
            private static MySingleton instance = new MySingleton();  
        }   
        private MySingleton(){}  
        public static MySingleton getInstance() {   
            return MySingletonHandler.instance;  
        }  
    } 
    
    /*
     * 懒汉式:
     * 在需要用的时候才创建对象
     * 多线程下微调后,多线程下,无法保证实例唯一的,
     */
    class Singer2{
    	private Singer2(){}
    	private static Singer2 createSinger = null;
    	//创建单例,
    	public static Singer2 getInstance(){
    		if(createSinger == null){
    			try {
    				Thread.sleep(200);
    				createSinger = new Singer2();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		
    		}
    		return createSinger;
    	}
    	
    }
    /*
     * 懒汉式 方法加锁实现线程同步
     * 加锁后效率低
     */
    
    class Singer3{
    	private Singer3(){}
    	private static Singer3 createSinger = null;
    	//创建单例,synchronized加锁
    	public static synchronized Singer3 getInstance(){
    		if(createSinger == null){
    			try {
    				Thread.sleep(200);
    				createSinger = new Singer3();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		return createSinger;
    	}
    	
    }
    /*
     * 懒汉式   同步代码块实现
     * 效率低
     */
    class Singer5{
    	private Singer5(){}
    	private static Singer5 createSinger = null;
    	//创建单例,synchronized加锁
    	public static  Singer5 getInstance(){
    		try {
    			synchronized (Singer5.class) {
    				if(createSinger == null){
    					Thread.sleep(200);
    					createSinger = new Singer5();
    				}
    			}
    		} catch (InterruptedException e) {
    				e.printStackTrace();
    		}
    		return createSinger;
    	}
    	
    }
    /*
     * 懒汉式:
     * 双检查锁机制DCL(double check lock)
     * 销量和同步并存
     */
    class Singer1{
    	private Singer1(){}
    	private static Singer1 createSinger = null;
    	//创建单例,synchronized加锁
    	public static  Singer1 getInstance(){
    		try {
    			if(createSinger == null){
    				Thread.sleep(200);
    			synchronized (Singer1.class) {
    				if (createSinger==null) {
    					createSinger = new Singer1();
    				}
    				}
    			}
    		} catch (InterruptedException e) {
    				e.printStackTrace();
    		}
    		return createSinger;
    	}
    	
    }
    
    
    /*
     * 俄汉式
     * 开始就产生了对象。对于项目中从开始到结束都没有用到的对象,会造成资源浪费
     * 多线程下测试安全,是同一个实例
     */
    class Singer4{  
        private static Singer4 instance = new Singer4();  
        private Singer4(){}
        public static Singer4 getInstance(){   
        	try {
    			Thread.sleep(200);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
          return instance;   
     }  
    } 

    多线程下的测试代码

    package com.demo01;
    
    
    
    public class MyThread extends Thread{  
          
        public void run() {   
            System.out.println(ClassFactory.getInstance().hashCode());  
        }  
          
        public static void main(String[] args) {   
              
            MyThread[] mts = new MyThread[10];  
            for(int i = 0 ; i < mts.length ; i++){  
                mts[i] = new MyThread();  
            }  
              
            for (int j = 0; j < mts.length; j++) {  
                mts[j].start();  
            }  
        }  
    } 
    

      

  • 相关阅读:
    用MySQL 生成随机密码增加大写处理
    【100题】第三十八 (天平称重、大输入流、去除重复URL)
    【编程珠玑】代码优化的27条经典法则
    cocos2dx:如何快速屏蔽触摸
    【2012百度之星资格赛】A:百度计算器的加法
    【2012百度之星资格赛】C:易手机的套餐
    去掉xcode编译warning:ld: warning: directory not found for option 'L
    【2012百度之星资格赛】D:共同狂欢
    【windows8开发】回复g10589119提出的问题(c#调用C++/CX dll)
    linux shell 之在线文本编辑sed
  • 原文地址:https://www.cnblogs.com/nn369/p/8010784.html
Copyright © 2020-2023  润新知