单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。它的目的是限制一个类只能创建一个对象,以确保在整个应用程序中只有一个共享的实例。
单例模式通常用于以下情况:
单例模式的关键特点包括:
常见的单例模式实现方式包括饿汉式、懒汉式、双重检查锁定等。每种实现方式都有其优缺点,选择适合具体需求的实现方式非常重要
这里使用了volatile,防止指令重排序。
另外,使用synchronized修饰代码,加锁变成线程安全。
- public class SingleTon {
- // 懒汉式
- private static volatile SingleTon singleTon;
- private SingleTon(){
- }
- public static SingleTon getInstance(){
- if(singleTon==null){
- synchronized (SingleTon.class){
- if(singleTon==null){
- return new SingleTon();
- }
- }
- }
- return singleTon;
- }
- }
这里的饿汉式没什么好说的。
- public class SingleTon1 {
- // 饿汉式
- private static final SingleTon1 singleTon1 = new SingleTon1();
- private SingleTon1(){
-
- }
- public static SingleTon1 getInstance(){
- return singleTon1;
- }
- }
前面两种懒汉式和饿汉式都可以被反射或者序列化破坏,他们俩可以把单例对象破坏掉(即产生多个对象)而使用枚举就可以避免这种情况,而且使用枚举在代码简洁的情况下,还不用做任何操作即可保证创建对象的单一性和线程的安全性。
- public enum EnumSingleTon {
- INSTANCE;
- EnumSingleTon(){
- System.out.println("枚举创建对象了");
- }
- public void doSomeThing(){
- System.out.println("这是枚举的单例模式");
- }
- public static void main(String[] args) {
- test();
- }
- public static void test(){
- EnumSingleTon enumSingleTon1 = EnumSingleTon.INSTANCE;
- EnumSingleTon enumSingleTon2 = EnumSingleTon.INSTANCE;
- System.out.print("enumSingleTon1和enumSingleTon2的地址是否相同:");
- System.out.println(enumSingleTon1==enumSingleTon2);
- }
- }
运行结果

学生所做,仅记录学习。