您现在的位置是:主页 > news > 织梦网站安装出现404 not found/手机黄页怎么找

织梦网站安装出现404 not found/手机黄页怎么找

admin2025/5/23 4:28:45news

简介织梦网站安装出现404 not found,手机黄页怎么找,中国安能建设集团有限公司网站,镭拓网站建设目录单例模式1.饿汉模式2.懒汉模式3.双重检查注意:重排序问题:解决:Volatile关键字4.静态内部类5.枚举单例模式 单例模式主要有5种模式: 饿汉模式:实例在初始化就已经创建好对象。懒汉模式:在使用实例时进…

织梦网站安装出现404 not found,手机黄页怎么找,中国安能建设集团有限公司网站,镭拓网站建设目录单例模式1.饿汉模式2.懒汉模式3.双重检查注意:重排序问题:解决:Volatile关键字4.静态内部类5.枚举单例模式 单例模式主要有5种模式: 饿汉模式:实例在初始化就已经创建好对象。懒汉模式:在使用实例时进…

目录

  • 单例模式
    • 1.饿汉模式
    • 2.懒汉模式
    • 3.双重检查
      • 注意:
      • 重排序问题:
      • 解决:Volatile关键字
    • 4.静态内部类
    • 5.枚举

单例模式

单例模式主要有5种模式:

  • 饿汉模式:实例在初始化就已经创建好对象。
  • 懒汉模式:在使用实例时进行判断,若不为null则创建对象,否则直接调用。
  • 双重检查:通过锁来双重判断实例是否为null。
  • 静态内部类:通过静态内部类去实例化对象。
  • 枚举:JDK1.5版本后提供了枚举,天然支持单例模式。

1.饿汉模式

实例在初始化就已经创建好对象,不管有没有使用都会创建,会造成资源浪费。

public class Main {private static Main instance = new Main();private Main(){}public static Main getInstance() {return instance;}
}

2.懒汉模式

实现了懒加载,但是在并发情况下会有多个线程同时进入if条件中,会产生多个实例。

public class Main {private static Main instance;private Main(){}public static Main getInstance() {if (instance != null)instance = new Main();return instance;}
}

3.双重检查

在获取实例时加锁进行双重判断来创建实例。

// 双重检查模式的懒汉单例模式
public class Singleton {private static Singleton instance = null;private Singleton() {}public static Singleton getInstance() {// 若对象为空,在多线程的访问下,多个线程会同时进入该if语句。若对象不为空,直接返回,不用进去排队if (instance == null) {// 对多线程进行排队,防止多次初始化synchronized (Singleton.class) {// 对单个线程进行判断,是否要初始化if (instance == null) {instance = new Singleton();                 }             }         }   return instance;}
}

注意:

以上代码可能会出现问题,因为instance = new Singleton()不是一个原子操作,会在执行时拆分成一下几个动作:

  1. 先进行new操作,JVM会分配内存地址、内存空间。
  2. 然后使用构造方法实例化对象。
  3. 最后再进行赋值,instance = 分配好的内存地址(引用保存的对象地址)。

重排序问题:

因为以上3个动作在真正执行时可能是1、2、3顺序,也可能1、3、2顺序,单线程下不影响结果,但多线程下使用1、3、2可能出现的问题:

  1. 假设A线程执行完1、3步骤(2还没有执行)。
  2. B线程进入到单例模式的if语句中,会直接得到Instance对象(在没有执行2步骤下),这时若使用该对象(instance.xxx())将会必然报错。

解决:Volatile关键字

在对象变量中加上volatile关键字如下:

private volatile static Singleton instance = null;

4.静态内部类

  • 采用了类加载的机制保证实例化只有一个线程。
  • 只会在第一次主动调用的时候加载,并且只加载一次。
public class Singleton {// 内部类中实例化对象private static class SingletonInstance {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonInstance.INSTANCE;}public static void main(String[] args) {Singleton instance = Singleton.getInstance();}
}

5.枚举

enum Singleton {INSTANCE;
}public class Main {public static void main(String[] args) {// 获取实例对象Singleton instance = Singleton.INSTANCE;}
}
  • 避免了多线程同步问题。
  • 可以防止反序列化后重新创建新对象。