Java 饿汉式\懒汉式六种方法

六种常见形式

1 饿汉式:直接创建对象,不存在线程安全问题
    直接实例化饿汉式(简洁直观)
    枚举式(最简洁)
    静态代码块饿汉式(适全复杂实例化)
    
2 懒汉式:延迟创建对象
    线程不安全(适用于单线程)
    线程安全(适用于多线程)
    静态内部类形式(适用于多线程)

饿汉式:

/*
	 *饿汉式:直接实例化饿汉式(简洁直观)
	 *1、构造器私有化
	 *2、自行创建,并且用静态变量保存
	 *3、向外提共这个实例
	 *4、强调一个单例,可以用final修改
	 */
	 public class Singleton1(){
	        public static final Singleton1 INSTANCE = new Singleton1();
			private Singleton1(){
			}
	 }
     public static void main(String[] args){
	      Singleton1 s= Singleton1.INSTANCE;
		  System.out.println(s);
	 }
     /*
	 *枚举式,表示该类型的对象是有限的几个 1.5之后
	 *可以限定为一个成了单例
	 */
	 public enum Singleton1(){
	     INSTANCE
	 }
     public static void main(String[] args){
	      Singleton1 s= Singleton1.INSTANCE;
		  System.out.println(s);
	 }

    /*
	*静态代码块饿汉式
	*
	*/
	public class Singleton1{
	    public static final Singleton1 INSTANCE;
		static{
		    INSTANCE = new Singleton1();
		}
		private Singleton1(){
		
		}
	}

懒汉式:

/*
	*线程不安全(适用于单线程)
	*可以加 synchronized 同步代码块来解决线安全问题
	*/
	public class Singleton1{
	   private static Singleton1 instance;
	   private Singleton1(){
	       
	   }
	   public static Singleton1 getInstance(){
	       if(instance == null){
	              try{
				      Thread.sleep(100);
				  }catch(InterruptedException e){
				      e.printStackTrace();
				  }
		         instance = new Singleton1();
		   }
		   return instance;
	   }
	}
	public static void main(){
	   Singleton1 s1= Singleton1.getInstance();
	}
	
	/*
	*线程安全(适用于多线程)
	*/
	public class Singleton1{
	   private static Singleton1 instance;
	   private Singleton1(){
	       
	   }
	   public static Singleton1 getInstance(){
	       if(instance == null){
	          synchronized(Singleton1.class){
	             if(instance == null){
	                try{
				        Thread.sleep(100);
				     }catch(InterruptedException e){
				         e.printStackTrace();
				     }
		             instance = new Singleton1();
		          }
	          }
	        }
		   return instance;
	   }
	}
	
	/*
	*静态内部类形式(适用于多线程)
	*内部类加载和初始代时,创建INSTANCE对象
	*是单独加载和初始化getInstance,是线程安全的
	*/
	public class Singleton1{
	    private Singleton1(){
		  
		}
		private static calss Inner{
		    private static final Singleton1 INSTANCE = new Singleton1();
		}
		public static Singleton1 getInstance(){
		    return Inner.INSTANCE;
		}
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值