单例模式

懒汉:

public class Singleton{
      
       // 因为这个变量要在静态方法中使用,所以需要加上static修饰  
       private static Singleton instance = null;

       //私有化构造器,好在内部控制创建实例的数目
       private Singleton(){
   
       }  
 
       //这个方法要定义成类方法
       public static Singleton getInstance(){
          
             if( instance == null ){
                     instance = new Singleton();
             }        
             return instance;
  
       }

}

饿汉

public class Singleton {

        private static Singleton instance = new Singleton();

        pirvate Singleton(){

       }  

       public static Singleton getInstance(){
                
             return instance;

       }      



}

  单例模式中“懒汉”实现了缓存的思想

在java中缓存的基本实现:

public class JavaCache {

/**

* 缓存数据的容器,定义成Map是方便访问,直接根据Key就可以获取Value了 key选用String是为了简单

*/

private Map<String, Object> map = new HashMap<String, Object>();





/**

* 从缓存中获取值

* 

* @param key

*            设置时候的key值

* @return key对应的Value值

*/

public Object getValue(String key) {

// 先从缓存里面取值

Object obj = map.get(key);

// 判断缓存里面是否有值

if (obj == null) {

        // 如果没有,那么就去获取相应的数据,比如读取数据库或者文件

       // 这里只是演示,所以直接写个假的值

        obj = key + ",value";

      // 把获取的值设置回到缓存里面

        map.put(key, obj);

    }

    // 如果有值了,就直接返回使用

    return obj;

   }

}

  利用缓存来实现单例模式

public class Singleton{

         //定义一个默认的key值,用来表示在缓存中的存放
        private  final static  String DFAULT_KEY = "one";
       
       //缓存实例的容器
       private static Map<String , Singleton> map = new HashMap<String,Singleton<();


       private Singleton(){

      }
  
      public class Singleton getInstance(){
         
               //先从缓存中获取
               Singleton insatce = map.get(DFAULT_KEY);
           
               if( instance ==  null ){
                         
                          instance = new Singleton();
                          map.put(DFAULT_KEY , instance);
               }
     
      }

}

线程安全:

         1 不在同步的懒汉式线程不安全的

         2 饿汉是安全的

改造:

       同时实现延迟加载也实现线程安全

    基础知识:

  

            解决方案的思路:

         实现:

   

public class Singleton{

          //类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例没有绑定关系,而且只有别调用到的时候才会装载,从而实现了延迟加载
         private static class SingletonHolder{
                //静态初始化器,由JVM来保证线程安全
                private static Singleton isntance = new Singleton();                               

        }  

         private Singleton(){
        
         }
       
         public static Singleton getInstance(){
           
                return SingletonHolder.instance;
         
         }          


}

  

原文地址:https://www.cnblogs.com/a757956132/p/4527319.html