解决多线程下单例模式中"懒汉模式"(延迟加载)的问题

获取单例对象的代码
public class MyObject {
    private MyObject(){}
    private static MyObject object;
    public static MyObject getInstance() {
        try {
            if (object == null) {
                       object = new MyObject();
           }
       } catch (InterruptedException e) {
           e.printStackTrace();
       } 
      return object;
    }
}
当启动多个线程执行MyObject.getInstance()的时候,获取到的对象会有多个,解决办法:
 
 
  • getInstance()方法上加synchronized关键字
	public class MyObject {
   		   private MyObject(){}
    		   private static MyObject object;
    			synchronized public static MyObject getInstance() {
       			 try {
           		 	if (object == null) {
           		            object = new MyObject();
           			}
       			} catch (InterruptedException e) {
           			e.printStackTrace();
       			}	 
      			return object;
    			}
		}
		这样整个方法会被上锁,效率低。
    
    
  • 使用DCL双检查锁机制
	public class MyObject {
   		   private MyObject(){}
    		   private static MyObject object;
    			 public static MyObject getInstance() {
       			 try {
           		 	if (object == null) {
					
					synchronized(Myobject.class){
						if(object==null){
           		            			object = new MyObject();
						}
					}
           			}
       			} catch (InterruptedException e) {
           			e.printStackTrace();
       			}	 
      			return object;
    			}
		}
       
       
  • 使用静态内置类实现单例
			public class MyObject {
    				private MyObject(){}

    				private static class MyObjectHandler{
       				 	private static MyObject myObject = new MyObject();
    				}
    				public static MyObject getInstance() {

       					 return MyObjectHandler.myObject;
   				 }
			}
		该方法在序列化及序列化的时候前后得到的对象会发生变化,添加readResove()方法即可:
			
			public class MyObject implements Serializable {
    				private static final long serialVersionUID = 1L;
    				private MyObject(){}
   				 private static class MyObjectHandler{
        				private static final MyObject myObject = new MyObject();
   				 }
   				 public static MyObject getInstance() {
       					 return MyObjectHandler.myObject;
   				 }
   				 protected Object readResolve() throws ObjectStreamException{
        				System.out.println("调用了readResolve方法! ");
       					 return MyObjectHandler.myObject;
   				 }
			}

		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值