zoukankan      html  css  js  c++  java
  • Java中单例七种写法(懒汉、恶汉、静态内部类、双重检验锁、枚举)

    /***
     * 懒汉模式 1
     * 可以延迟加载,但线程不安全。
     * @author admin
     *
     */
    public class TestSinleton1 {
    	private static  TestSinleton1 sinleton;
    	private TestSinleton1(){
    		
    	}
    	public static  TestSinleton1 getSinleton(){
    		if(sinleton==null){
    			return new TestSinleton1();
    		}
    		return sinleton;
    	}
    }
    /***
     * 懒汉模式变种 2
     * @author admin
     * 使用了synchronized关键字,既可以延迟加载,又线程安全,但是执行效率低。
     */
    class TestSinleton2{
    	private static  TestSinleton2 sinleton;
    	private TestSinleton2(){
    		
    	}
    	public  synchronized static  TestSinleton2 getSinleton(){
    		if(sinleton==null){
    			return new TestSinleton2();
    		}
    		return sinleton;
    	}
    }
    /***
     * 饿汉模式 3
     * @author admin
     * 基于classload机制,静态变量在类装载时进行初始化
     * 可以避免线程安全问题,但是没有延迟加载。
     */
    class TestSinleton3{
    	private static  TestSinleton3 sinleton = new TestSinleton3();
    	private TestSinleton3(){
    	}
    	public static TestSinleton3 getSinleton(){
    		return sinleton;
    	}
    }
    /***
     * 恶汉变种模式 4
     * @author admin
     * 基于静态 代码块,在实例化或者第一次调用时执行
     * 既可以延迟加载,又线程安全
     */
    class TestSinleton4{
    	private static  TestSinleton4 sinleton =null;
    	static{
    		sinleton = new TestSinleton4();
    	}
    	public static TestSinleton4 getSinleton(){
    		return sinleton;
    	}
    }
    /***
     * 双重校验锁 5
     * @author admin
     * 懒汉模式的优化版,拥有线程安全、高效率以及延迟加载等特性。但是这种方式需要jdk1.5以上,且在一些平台和编译器下有错。
     */
    class TestSinleton5{
    	private static volatile TestSinleton5 sinleton;
    	private TestSinleton5(){
    		
    	}
    	public static TestSinleton5 getSinleton(){
    		if(sinleton==null){
    			synchronized (TestSinleton5.class) {
    				if(sinleton==null){
    					
    					sinleton = new  TestSinleton5();
    				}
    			}
    		}
    		return sinleton;
    	}
    }
    /***
     * 静态内部类 6
     * @author admin
     * 恶汉模式的优化版,在类被装载时,静态内部类并没有被实例化,
     * 只有getInstance()时才 会装载 SingletonHolder 类,静态内部类方式也能很好地,实现线程安全、高效率和延迟加载特性。
     */
    class TestSinleton6{
    	private static class SingletonHolder {
    		private static final TestSinleton6 sinleton = new TestSinleton6();
    	}
    	private TestSinleton6(){}
    	public static final TestSinleton6 getSinleton(){
    		return SingletonHolder.sinleton;
    	}
    	
    }
    /***
     * 枚举7
     * @author admin
     *避免多线程同步问题
     */
    enum TestSinleton7 {
    	SINLETON;
    }
    

      

  • 相关阅读:
    yii2 gii 命令行自动生成控制器和模型
    控制器中的方法命名规范
    Vue Property or method "" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based
    IDEA插件:GsonFormat
    Spring Boot : Access denied for user ''@'localhost' (using password: NO)
    Typora添加主题
    Git基础命令图解
    Java Joda-Time 处理时间工具类(JDK1.7以上)
    Java日期工具类(基于JDK1.7版本)
    Oracle SQL Developer 连接Oracle出现【 状态: 失败 -测试失败: ORA-01017: invalid username/password; logon denied】
  • 原文地址:https://www.cnblogs.com/xiaoblog/p/5872107.html
Copyright © 2011-2022 走看看