java基础:单例模式(懒汉,饿汉)

单例模式:(饱汉(懒汉),饿汉)

    1.单例模式应用于一个类只有一个实例的情况,并且为其实例提供一个全局的访问点。
    2.特点:
        2.1:一个类只有一个实例
        2.2:自己创建这个类
        2.3:整个系统只能用这个实例
    
    3.实现方法:
        3.1:饿汉式:单例实例在类装载时就构建,急切初始化。(预先加载法)
       
      

public class Singleton1 {

			private Singleton1() {

			}

		public static Singleton1 instance = new Singleton1();

			public Singleton1 getInstance() {
				return instance;
			}

		}

    优点:1.线程安全 
               2.在类加载的同时已经创建好一个静态对象,调用时反应速度快

    
    缺点:资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),
               那么这个实例仍然初始化


        3.2:懒汉式(饱汉式):单例实例在第一次被使用时构建,延迟初始化
         

class Singleton2 {
			private Singleton2() {
		}

		public static Singleton2 instance = null;

		public static Singleton2 getInstance() {
			if (instance == null) {
     //多个线程判断instance都为null时,在执行new操作时多线程会出现重复情况
				instance = new Singleton2();
			}
			return instance;
			}
		}

    注意: 懒汉式在单个线程中没有问题,但在多线程就可能会出现两个或多个Singleton2实例情况
          虽然后面实例化的Singleton2会覆盖前面实例化的Singleton2,但最好避免这样的情况。
          改进方式就是加锁synchornized 
       

class Singleton3 {
		private Singleton3() {
		}

		public static Singleton3 instance = null;

		public static synchronized Singleton3 getInstance() {
			if (instance == null) {
				instance = new Singleton3();
			}
			return instance;
			}
		}

        
        优点:资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法
        缺点:第一次加载时不够快,多线程使用不必要的同步开销大

猜你喜欢

转载自blog.csdn.net/qq_40973475/article/details/83443656