码迷,mamicode.com
首页 > 编程语言 > 详细

java 单例模式

时间:2020-04-03 12:13:53      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:ati   需要   静态类   内存地址   初始   类静态变量   饿汉式   问题   静态   

1. 饿汉式: 类静态变量,利用类的初始化,jvm 中一个class 只会初始化一次 

public class A{
    public static final A a= new A();
}

 

2. 懒汉式

public class A{
    private static A a;
    public synchronized static A getIns(){
       if(a==null){
             a = new A();
        }      
        return a;
    }          
}

  缺点: 对方法同步,效率低,每次进入方法都需要同步,其实只是第一次进入需要同步控制,当有值时就没有必要了。

改进1: 只对第一次a为null 的时候加同步

public class A{
        private static A a;
        public static A getIns(){
            if(a==null){
                  synchronized(A.class){
                      if(a==null) a = new A();
                  }
              }
              return a;
        }
}    

  缺点:java 重排序问题 , a=new A();  虽是一句,但在jvm是三步

  1.分配内存空间 2. 初始化对象 3. 将a 指向刚才的内存地址  。  重排序可能导致第二步在最后。 

       假设线程一 执行完成不在1 ,3  。 此时线程二判断a 此时不为null 就返回了。 这时a并未初始化。(但是应该没有哪个业务会这么快的访问前两次getIns).

  优化: 避免重排序,使用volatile 修饰。 

改进二: 依然利用类的初始化,使用内部静态类

public class A{
    public static class B{
       public static final A a= new A();
   }
   public static A getIns(){
          return B.a;
   }
}

 

java 单例模式

标签:ati   需要   静态类   内存地址   初始   类静态变量   饿汉式   问题   静态   

原文地址:https://www.cnblogs.com/zhangchenglzhao/p/12625395.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!