今天我们来说说一个非常常用的模式,单例模式,单例模式让某个类中有自己的实例,而且只实例化一次,避免重复实例化,单例模式让某个类提供了全局唯一访问点,如果某个类被其他对象频繁使用,就可以考虑单例模式,以下用代码来分析:
饿汉式单例模式举例:
/* * 饿汉式单例模式 * 饿汉式的这种单例模式是线程安全的 * 需要根据业务需求来觉得要不要使用饿汉式单例模式 */ public class SingletonHungry { /* * 直接以变量的形式实例化了当前对象,并进行了私有化,(这种方式的话在不管被不被使用,就已经实例化) */ private static SingletonHungry singletonHungry = new SingletonHungry(); public static SingletonHungry getInstance() { return singletonHungry; } public void printlnMethod() { System.out.println("线程安全的饿汉式单例模式..."); } }
懒汉式单例模式
// 懒汉式单例模式 // 懒汉式的这种单例模式是线程不安全的,因为多线程并发性调用就会引发线程不安全问题 // 需要根据业务需求来觉得要不要使用懒汉式单例模式 public class SingletonLazy { /* * 首先申明一个对象变量,变量都是必须私有化 */ private static SingletonLazy singletonLazy = null; public static SingletonLazy getInstance() { if (null == singletonLazy) { singletonLazy = new SingletonLazy(); } return singletonLazy; } public void printlnMethod() { System.out.println("懒汉式单例模式,线程不安全的,因为多线程并发调用会导致线程不安全"); } }
以上的懒汉式单例模式,有不足之处,所以以下这个案例就是解决多线程并发调用引发的不安全问题:
/* * 之前提到的懒汉式单例模式,存在多线程并发调用引发线程不安全问题,现在就增加同步来解决这个问题 */ public class SingletonUpdate { private static SingletonUpdate singletonUpdate = null; public static SingletonUpdate getInstance() { if (null == singletonUpdate) { synchronized (SingletonUpdate.class) { if (null == singletonUpdate) { singletonUpdate = new SingletonUpdate(); } } } return singletonUpdate; } public void printlnMethod() { System.out.println("懒汉式单例模式,线程不安全的,因为多线程并发调用会导致线程不安全 这个是Update升级版...."); }
关于线程的安全问题,对于为什么会出现安全问题,可以看Android-多线程安全问题-synchronized,博客
测试程序:
// 测试程序 public class Main { public static void main(String[] args) { SingletonHungry.getInstance().printlnMethod(); SingletonLazy.getInstance().printlnMethod(); SingletonUpdate.getInstance().printlnMethod(); } }
运行结果:
静态内部类 单例模式:
package android.java.thread13; /* * 内部静态类 单例模式 */ class SingletonState { private SingletonState() {} private static class SingletonClass { public static SingletonState singletonState = new SingletonState(); } public static SingletonState getNewInstance() { return SingletonClass.singletonState; } public void printlnMethod() { System.out.println("内部静态类 单例模式..."); } }
使用 静态内部类 单例模式:
package android.java.thread13; /** * 使用内部静态类 单例模式 */ public class Main { public static void main(String[] args) { // new SingletonState(); // 会报错 ❌ // new SingletonState(参数); // 会报错 ❌ // 实例化 内部静态类 单例模式 SingletonState singletonState = SingletonState.getNewInstance(); singletonState.printlnMethod(); } }
打印: