初学单例模式

单例模式的作用

  就是只能创建一个对象

1.饿汉式(线程安全,因为太饿了,开始就要创建对象)

 1 package com.xasxt.dao;
 2 public class Singleton2 {
 3    //第一步:开始就创建私有的,静态的对象
 4   private static Singleton2 instance = new Singleton2();
 5   
 6   //第二步:私有化构造器
 7    private Singleton2(){}
 8 
 9    //第三步:静态,返回值是当前类的方法
10    public static Singleton2 getInstance(){
11       return instance;
12    }
13 }

 

2.饿汉式之静态代码块(线程安全)

 1 package com.xasxt.dao;
 2 public class Singleton5 {
 3     //第一步:创建一个私有的,静态的对象
 4     private static Singleton5 instance ;
 5     //第二步:在静态代码块中给对象赋初值
 6     static {
 7         instance = new Singleton5();
 8     }
 9     //第三步:私有化构造器
10     private Singleton5(){};
11     
12     //第四部:创建一个静态的,返回值是当前类的方法
13     public static Singleton5 getInstance(){
14         return instance;
15     }
16 }

3.懒汉式(线程不安全)

 1 package com.xasxt.dao;
 2 
 3 public class Singleton {
 4    //第一步:创建一个私有的静态的变量
 5    private static Singleton instance;
 6 
 7    //第二步:构造器私有化
 8    private Singleton(){}
 9 
10    //第三步:创建一个公共的、静态的、返回值为当前类的方法
11    public static Singleton getInstance(){
12       if(instance == null){
13          instance = new Singleton();
14       }
15       return instance;
16    }
17 }

4.懒汉式之同步方法锁(加锁之后,线程安全)

 1 package com.xasxt.dao;
 2 
 3 public class Singleton3 {
 4     //创建一个私有的,静态的对象
 5     private static Singleton3 instance;
 6     
 7     //第二步:构造器私有化
 8     private Singleton3(){};
 9     
10     //第三步:创建一个公共的、静态的、返回值为当前类并且加锁(synchronized)的方法
11     public static synchronized Singleton3 getInstacne(){
12         if(instance == null){
13             instance = new Singleton3();
14         }
15         return instance;
16     }
17 
18 }

5.单例模式之双重校验锁(线程安全)

 1 package com.xasxt.dao;
 2 public class Singleton6 {
 3     //第一步:创建一个有volatile修饰符的变量
 4     private static volatile Singleton6 instance;
 5     
 6     //第二步:构造器私有化
 7     private Singleton6(){};
 8 
 9     //第三步:创建一个公共的、静态的、返回值为当前类的方法
10     public static Singleton6 getInstance(){
11         if(instance == null){
12             //第一次判断之后加锁
13             synchronized (Singleton6.class){
14                 if(instance == null){
15                     //第二次判断之后赋值
16                     instance = new Singleton6();
17                 }
18             }
19         }
20         return instance;
21     }
22 }

6.单例模式之静态内部类(线程安全)

 1 package com.xasxt.dao;
 2 
 3 public class Singleton7 {
 4     //第一步:创建私有的静态内部类
 5     private static class s {
 6         
 7         //第二步,在内部类中实例化对象,变量必须是final修饰
 8       private static final Singleton7 instnce = new Singleton7();
 9   }
10         //第三步:构造器私有化
11         private Singleton7(){};
12     
13         //第四步:创建一个final修饰的方法
14         public static final Singleton7 getInstnce(){
15             
16             //第五步:通过内部类名调用方法
17             return s.instnce;
18         }
19 }
posted @ 2020-04-16 13:57  江南0o0  阅读(146)  评论(0编辑  收藏  举报