当前位置: 代码迷 >> 综合 >> 写一个简单的单例类(Singleton)
  详细解决方案

写一个简单的单例类(Singleton)

热度:102   发布时间:2023-10-12 00:50:55.0

什么是单例模式

保证一个类只有一个实例(对象)

单例模式的应用场景

  1. 用于符合某些特殊的业务需求, 如:保证一个国家只有一个主席,一个公司只有一个CEO
  2. 用于节约系统资源,如:线程池、连接池这种对象会消耗较多系统资源, 程序中保证这种对象只有一个

如何实现单例

分析:为什么一个类可以创建多个对象?
通过new关键字调用构造方法,构造方法是公开的。
步骤:
1、把所有构造方法定义为私有的
2、在类中定义静态的该类的对象,调用构造方法创建对象
3、在类中定义静态的方法,返回该类的对象

单例的分类

饿汉式

定义对象时直接创建对象
特点:一旦类加载后,就马上分配对象的内存
缺点:如果类不调用getInstance()方法时,会浪费内存
优点:代码简洁,没有线程安全问题

1.	//饿汉式单例模式  
2.	public class HungrySingleton {  
3.	    //私有化构造方法使得该类无法在外部通过new 进行实例化  
4.	    private HungrySingleton(){  
5.	  
6.	    }  
7.	  
8.	    //准备一个类属性,指向一个实例化对象。 因为是类属性,所以只有一个  
9.	    private static HungrySingleton instance = new HungrySingleton();  
10.	  
11.	    //public static 方法,提供给调用者获取12行定义的对象  
12.	    public static HungrySingleton getInstance(){  
13.	        return instance;  
14.	    }  
15.	}  

测试:

1.	public class TestHungrySingleton {  
2.	    public static void main(String[] args) {  
3.	        //通过new实例化会报错  
4.	        //GiantDragon g = new GiantDragon();  
5.	  
6.	        //只能通过getInstance得到对象  
7.	  
8.	        HungrySingleton g1 = HungrySingleton.getInstance();  
9.	        HungrySingleton g2 = HungrySingleton.getInstance();  
10.	        HungrySingleton g3 = HungrySingleton.getInstance();  
11.	  
12.	        //都是同一个对象  
13.	        System.out.println(g1==g2);  
14.	        System.out.println(g1==g3);  
15.	    }  
16.	}  
懒汉式

不一开始创建对象,在调用getInstance方法后创建对象
如果类不调用getInstance()方法,不会浪费内存
存在线程安全问题

1.	/** 
2.	 * 懒汉式单例模式 
3.	 * @author xray 
4.	 * 
5.	 */  
6.	public class LazySingleton {  
7.	  
8.	    //定义对象赋值为null  
9.	    private static LazySingleton single = null;  
10.	      
11.	    //定义私有构造方法  
12.	    private LazySingleton(){  
13.	        System.out.println("创建了懒汉式单例模式对象");  
14.	    }  
15.	      
16.	    //返回对象  
17.	    public static LazySingleton getInstance(){  
18.	        //判断如果对象不为null,就不用进入同步块,这样可以提高性能  
19.	        if(single == null){  
20.	            //使用同步块,进行同步处理  
21.	            synchronized (LazySingleton.class) {              
22.	                //判断对象为null,才创建对象  
23.	                if(single == null){  
24.	                    single = new LazySingleton();  
25.	                }  
26.	            }  
27.	        }  
28.	        return single;  
29.	    }  
30.	}

测试:

1.	public class TestLazySingleton {  
2.	  
3.	    public static void main(String[] args) {  
4.	        //单线程环境  
5.	//      for(int i = 0;i < 10;i++){  
6.	//          LazySingleton single = LazySingleton.getInstance();  
7.	//          System.out.println(single.hashCode());  
8.	//      }  
9.	        //多线程环境  
10.	        for(int i = 0;i < 10;i++){  
11.	            new Thread(()->{               
12.	                LazySingleton single = LazySingleton.getInstance();  
13.	                System.out.println(single.hashCode());  
14.	            }).start();  
15.	        }  
16.	    }  
17.	
18.	}  
  相关解决方案