怎样做淘宝推广网站品玩 wordpress主题
2026/4/18 10:10:44 网站建设 项目流程
怎样做淘宝推广网站,品玩 wordpress主题,中远智达网站建设,广东建设行业信息网目录一、简介二、单例模式实现方式1、饿汉式单例#xff08;推荐#xff09;饿汉式-方式1#xff08;**静态变量方式**#xff09;饿汉式-方式2#xff08;静态代码块方式#xff09;2、懒汉式单例懒汉式-方法1#xff08;线程不安全#xff09;懒汉式-方法2#xff0…目录一、简介二、单例模式实现方式1、饿汉式单例推荐饿汉式-方式1**静态变量方式**饿汉式-方式2静态代码块方式2、懒汉式单例懒汉式-方法1线程不安全懒汉式-方法2线程安全懒汉式-方法3双重锁结构三、单例破坏的方式1、反射攻击2、序列化攻击3、克隆攻击4、防御方式一、简介单例模式是oop面向对象编程语言的一种概念顾名思义就是一个类只能有一个实例对象。单例模式Singleton Pattern是 Java 中最简单的设计模式之一这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。二、单例模式实现方式单例设计模式分类两种饿汉式类加载就会导致该单实例对象被创建。懒汉式类加载不会导致该单实例对象被创建而是首次使用该对象时才会创建。1、饿汉式单例推荐饿汉式-方式1静态变量方式这种方法通过将对象的实例设置为静态的方式保证了该对象的实例永远只有一份,且该对象的创建在类加载的时候就会立即创建在jvm内存中的方法区在程序运行期间永久存在所以当我们的对象太大的时候就会造成一种资源的浪费。会产生大量类加载之后但是没有使用/** * 饿汉式 * 静态变量创建类的对象 */publicclassSingleton{//私有构造方法privateSingleton(){}//在成员位置创建该类的对象privatestaticSingletoninstancenewSingleton();//对外提供静态方法获取该对象publicstaticSingletongetInstance(){returninstance;}}通过static关键字在类加载时创建对象。优化实现上述传统方式中由于类加载时就实例化对象因此当我们调用这个类的其它静态方法时也会触发类加载从而实例化单例独享会导致空间的暂时浪费。由于静态内部类中的对象不会默认加载直到调用了获取该内部类属性的方法。因此可用静态内部类封装静态实例变量。饿汉式-方式2静态代码块方式对象的创建是在静态代码块中也是对着类的加载而创建。所以和饿汉式的方式1基本上一样。/** * 饿汉式-方法2 * 在静态代码块中创建该类对象 */publicclassSingleton{//私有构造方法privateSingleton(){}//在成员位置创建该类的对象privatestaticSingletoninstance;static{instancenewSingleton();}//对外提供静态方法获取该对象publicstaticSingletongetInstance(){returninstance;}}classSingleton{// 私有构造函数privateSingleton(){}// 静态内部类privatestaticclassSingletonHolder{privatestaticSingletoninstancenewSingleton();}publicstaticSingletongetInstance(){returnSingletonHolder.instance;}}2、懒汉式单例懒汉式-方法1线程不安全/** * 懒汉式 * 线程不安全 */publicclassSingleton{//私有构造方法privateSingleton(){}//在成员位置创建该类的对象privatestaticSingletoninstance;//对外提供静态方法获取该对象publicstaticSingletongetInstance(){if(instancenull){instancenewSingleton();}returninstance;}}懒汉式-方法2线程安全由于可能有多个线程同时要使用对象因此需要考虑线程安全问题防止并发访问时生成多个实例。通常需要加锁来解决并发冲突是用时间换空间的方案。/** * 懒汉式 * 线程安全 */publicclassSingleton{//私有构造方法privateSingleton(){}//在成员位置创建该类的对象privatestaticSingletoninstance;//对外提供静态方法获取该对象,并且加锁publicstaticsynchronizedSingletongetInstance(){if(instancenull){instancenewSingleton();}returninstance;}}懒汉式-方法3双重锁结构双重检查锁模式是一种非常好的单例实现模式解决了单例、性能、线程安全问题但是呢JVM在实例化对象的时候会进行优化和指令重排序操作在多线程的情况下就可能会出现空指针问题对于上述对象的创建主要分为三个部分分配对象的内存空间。初始化对象。设置instance指针指向对象所在的内存空间。为了提高性能在JVM在实例化对象的时候会进行优化和指令重排序操作也就是说有可能将我们上述的第七行和第九行代码进行顺序的交换。/** * 双重检查方式 */publicclassSingleton{//私有构造方法privateSingleton(){}//使用volatile修饰禁止重排序privatestaticvolatileSingletoninstance;//对外提供静态方法获取该对象publicstaticSingletongetInstance(){//第一次判断如果instance不为null不进入抢锁阶段直接返回实际if(instancenull){synchronized(Singleton.class){//抢到锁之后再次判断是否为空if(instancenull){instancenewSingleton();}}}returninstance;}}三、单例破坏的方式1、反射攻击publicclassSingleton{privatestaticfinalSingletonINSTANCEnewSingleton();privateSingleton(){// 私有构造}publicstaticSingletongetInstance(){returnINSTANCE;}}// 反射攻击代码publicclassReflectionAttack{publicstaticvoidmain(String[]args)throwsException{Singletoninstance1Singleton.getInstance();// 使用反射创建第二个实例ConstructorSingletonconstructorSingleton.class.getDeclaredConstructor();constructor.setAccessible(true);// 突破私有访问限制Singletoninstance2constructor.newInstance();System.out.println(instance1instance2);// false破坏了单例System.out.println(instance1: instance1);System.out.println(instance2: instance2);}}通过类信息进行反射创建。2、序列化攻击importjava.io.*;publicclassSingletonimplementsSerializable{privatestaticfinalSingletonINSTANCEnewSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}// 序列化攻击publicclassSerializationAttack{publicstaticvoidmain(String[]args)throwsException{Singletoninstance1Singleton.getInstance();// 序列化ByteArrayOutputStreambaosnewByteArrayOutputStream();ObjectOutputStreamoosnewObjectOutputStream(baos);oos.writeObject(instance1);// 反序列化会创建新实例ByteArrayInputStreambaisnewByteArrayInputStream(baos.toByteArray());ObjectInputStreamoisnewObjectInputStream(bais);Singletoninstance2(Singleton)ois.readObject();System.out.println(instance1instance2);// false}}3、克隆攻击publicclassCloneableSingletonimplementsCloneable{privatestaticfinalCloneableSingletonINSTANCEnewCloneableSingleton();privateCloneableSingleton(){}publicstaticCloneableSingletongetInstance(){returnINSTANCE;}OverrideprotectedObjectclone()throwsCloneNotSupportedException{returnsuper.clone();// 默认实现会创建新实例}}// 攻击CloneableSingletoninstance1CloneableSingleton.getInstance();CloneableSingletoninstance2(CloneableSingleton)instance1.clone();System.out.println(instance1instance2);// false4、防御方式// 方法1使用统一的类加载器应用类加载器// 方法2在getInstance()中检查类加载器publicclassClassLoaderSafeSingleton{privatestaticfinalClassLoaderSafeSingletonINSTANCEnewClassLoaderSafeSingleton();privateClassLoaderSafeSingleton(){// 检查类加载器ClassLoaderclthis.getClass().getClassLoader();if(cl!ClassLoader.getSystemClassLoader()){thrownewRuntimeException(只能由系统类加载器加载);}}publicstaticClassLoaderSafeSingletongetInstance(){returnINSTANCE;}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询