-
饿汉式1(静态变量)
- 实现步骤:
- 设置一个静态的 final类型的成员变量instance ,在类的内部创建好对象给到instance变量;
- 将构造方法私有化,禁止外部通过new的方式创建对象;
- 提供一个静态的公有的获取instance的方法;
- 实现代码:
略 - 优缺点分析:
- 优点:代码实现简单,容易想到,因为在类加载的时候已经创建实例了,所以是线程安全的。
- 缺点:因为在类加载的时候就已经创建实例了,消耗内存了,无法实现懒加载,若该对象自始至终没有被使用到的话则会造成内存的浪费。
- 若确定一定会使用到该实例则可以使用这种方法且不会造成内存浪费和多线程问题
- 实现步骤:
-
饿汉式2(静态代码块)
- 实现步骤:
- 设置一个静态的但不是final类型的变量instance 接收类的对象实例;
- 将实例化对象的代码放到static静态代码块中
- 将构造方法私有化,禁止外部通过new的方式创建对象;
- 提供一个静态的公有获取instance实例的方法;
- 实现代码:
略 - 优缺点分析:
- 这种方式和上面的方式其实是类似的,只不过将实例化对象放入到静态代码块中了,也是在类加载的时候就执行静态代码块的代码了。
- 缺点:和上面一样。
- 总的来说:可用但是可能造成内存浪费。
- 实现步骤:
-
懒汉式1(线程不安全)
-
实现步骤:
- 设置一个静态的但不是final类型的变量instance接收类的对象实例;
- 将构造方法私有化,禁止外部通过new的方式创建对象;
- 提供一个静态的共有获取instance实例的方法,并在方法内对instance实例进行初始化。
-
实现代码:
-
class SingletonLazy{ private static SingletonLazy instance; private SingletonLazy(){ } public static SingletonLazy getInstance() { if (instance ==null){ //此处用到了共享变量作判断,可能会出现线程安全问题 instance = new SingletonLazy(); } return instance; } }
-
-
优缺点分析:
- 优点:
- 能够实现懒加载的效果,节省内存空间,在用到的时候才会去实例化。
- 缺点:
- 在判断instance是否为空的时候,可能会有多个线程同时进入到这个判断中,是线程不安全的。
- 总得来说:这种写法是绝对不能使用的,因为它在多线程环境下没有办法做到单例。
- 优点:
-
-
懒汉式(线程安全,同步方法)
-
实现步骤:
- 设置一个静态的但不是final类型的变量instance接收类的对象实例;
- 将构造方法私有化,禁止外部通过new的方式创建对象;
- 提供一个静态的共有获取instance实例的方法,同时在方法加入一个synchronized关键字声明为同步方法,在方法内对instance实例进行初始化。
-
实现代码:
-
class SingletonLazy{ private static SingletonLazy instance; private SingletonLazy(){ } public sta
-
-
单例模式的8种实现方法
于 2024-01-03 19:03:53 首次发布
本文详细介绍了单例模式的8种实现方法,包括饿汉式1和2、懒汉式1至4、静态内部类实现、枚举实现,分析了各自的优缺点和适用场景。重点讨论了线程安全、懒加载和内存占用等问题,其中双重检查、静态内部类和枚举实现被认为是更优的选择。
摘要由CSDN通过智能技术生成