如何写出更好的Java单例(Singleton)模式,以及单例模式的攻防源代码

简介: 如何写出更好的Java单例(Singleton)模式,以及单例模式的攻防源代码
package singleton;
public class JerrySingleton {
  @SuppressWarnings("unused")
  private String name;
    private JerrySingleton(){  
      name = "Jerry";
    }  
    private  static class SingletonHolder{  
        private static final JerrySingleton INSTANCE = new JerrySingleton();  
    }  
    public static JerrySingleton getInstance()  
    {  
        return SingletonHolder.INSTANCE;  
    }  
}
package singleton;
public enum JerrySingletonAnotherApproach {
  INSTANCE ;  
  private String name = "Jerry" ;
  public String getName() {  
      return this.name;  
  }  
}
package singleton;
public class JerrySingletonImproved  
{  
    private static boolean flag = false;  
    private JerrySingletonImproved(){  
        synchronized(JerrySingletonImproved.class)  
        {  
            if(flag == false)  
            {  
                flag = !flag;  
            }  
            else 
            {  
                throw new RuntimeException("Singleton violated");  
            }  
        }  
    }  
    private  static class SingletonHolder{  
        private static final JerrySingletonImproved INSTANCE = new JerrySingletonImproved();  
    }  
    public static JerrySingletonImproved getInstance()  
    {  
        return SingletonHolder.INSTANCE;  
    }  
}
package singleton;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class SingletonAttack {
  @SuppressWarnings("unused")
  private static void test1() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
    Class<?> classType = JerrySingleton.class;  
        Constructor<?> c = classType.getDeclaredConstructor(JerrySingleton.class);  
        c.setAccessible(true);  
        JerrySingleton e1 = (JerrySingleton)c.newInstance();  
        JerrySingleton e2 = JerrySingleton.getInstance();  
        System.out.println(e1 == e2);  
  }
  private static void test2() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
    Class<?> classType = JerrySingletonImproved.class;  
        Constructor<?> c = classType.getDeclaredConstructor();  
        c.setAccessible(true);  
        JerrySingletonImproved e1 = (JerrySingletonImproved)c.newInstance();  
        JerrySingletonImproved e2 = JerrySingletonImproved.getInstance();  
        System.out.println(e1 == e2);  
  }
  @SuppressWarnings("unused")
  private static void test3() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
    Class<?> classType = JerrySingletonAnotherApproach.class;   
        Constructor<?> c = classType.getDeclaredConstructor();  
        c.setAccessible(true);  
        JerrySingletonAnotherApproach e1 = (JerrySingletonAnotherApproach)c.newInstance();  
        JerrySingletonAnotherApproach e2 = JerrySingletonAnotherApproach.INSTANCE;
        System.out.println(e1 == e2);  
  }
  public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException  
    {  
        test2();
    System.out.println("Name:" + JerrySingletonAnotherApproach.INSTANCE.getName());
        // test3();
    }  
}
package singleton;
public class SingletonInnerClass {
  /*
   * 当执行getInstance()方法的时候就去调用FileIOHolder内部类里面的INSTANCE实例,
   * 此时FileIOHolder内部类会被加载到内存里,在类加载的时候就对INSTANCE实例进行初始化。
   * 和饿汉式一个道理,保证了只有一个实例,而且在调用getInstance()方法的时候才进行INSTANCE实例的初始化,
   * 又具有懒汉式的部分特性。”
   */
  private static final class FileIOHolder {
    private static final SingletonInnerClass INSTANCE = new SingletonInnerClass();
  }
  private SingletonInnerClass() {
    System.out.println("constructor of SingletonInnerClass...");
  }
  public static SingletonInnerClass getInstance() {
    String trimTest = new String("i042416").trim();
    System.out.println("GetInstance called..." + trimTest);
    return FileIOHolder.INSTANCE;
  }
  private static void objectTest(){
    Object obj = new Object();
    Class<? extends Object> clas = obj.getClass();
    System.out.println(clas.getClassLoader());
  }
  public static void main(String arg[]){
    Object obj1 = SingletonInnerClass.getInstance();
    Object obj2 = SingletonInnerClass.getInstance();
    System.out.println(obj1 == obj2);
    objectTest();
  }
}


相关文章
|
12天前
|
设计模式 安全 Java
Java 编程中的设计模式:单例模式的深度解析
【9月更文挑战第22天】在Java的世界里,单例模式就像是一位老练的舞者,轻盈地穿梭在对象创建的舞台上。它确保了一个类仅有一个实例,并提供全局访问点。这不仅仅是代码优雅的体现,更是资源管理的高手。我们将一起探索单例模式的奥秘,从基础实现到高级应用,再到它与现代Java版本的舞蹈,让我们揭开单例模式的面纱,一探究竟。
23 11
|
28天前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
48 11
|
9天前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
9天前
|
设计模式 Java 安全
Java设计模式-单例模式(2)
Java设计模式-单例模式(2)
|
2月前
|
设计模式 安全 Java
Java 单例模式,背后有着何种不为人知的秘密?开启探索之旅,寻找答案!
【8月更文挑战第30天】单例模式确保一个类只有一个实例并提供全局访问点,适用于需全局共享的宝贵资源如数据库连接池、日志记录器等。Java中有多种单例模式实现,包括饿汉式、懒汉式、同步方法和双重检查锁定。饿汉式在类加载时创建实例,懒汉式则在首次调用时创建,后者在多线程环境下需使用同步机制保证线程安全。单例模式有助于提高代码的可维护性和扩展性,应根据需求选择合适实现方式。
30 1
|
1月前
|
JSON Java UED
uniapp:使用DCloud的uni-push推送消息通知(在线模式)java实现
以上展示了使用Java结合DCloud的uni-push进行在线消息推送的基本步骤和实现方法。实际部署时,可能需要依据实际项目的规模,业务场景及用户基数进行必要的调整和优化,确保消息推送机制在保证用户体验的同时也满足业务需求。
23 0
|
2月前
|
设计模式 安全 Java
Java编程中的单例模式深度解析
【8月更文挑战第31天】 单例模式,作为设计模式中的经典之一,在Java编程实践中扮演着重要的角色。本文将通过简洁易懂的语言,逐步引导读者理解单例模式的本质、实现方法及其在实际应用中的重要性。从基础概念出发,到代码示例,再到高级应用,我们将一起探索这一模式如何优雅地解决资源共享和性能优化的问题。
|
2月前
|
设计模式 安全 Java
Java中的单例模式:理解与实践
【8月更文挑战第31天】在软件设计中,单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨Java中实现单例模式的不同方法,包括懒汉式、饿汉式、双重校验锁以及静态内部类等方法。每种方法都有其适用场景和潜在问题,我们将通过代码示例来展示如何根据具体需求选择合适的实现方式。
|
2月前
|
设计模式 安全 Java
Java编程中的单例模式实现与应用
【8月更文挑战第31天】在Java的世界里,单例模式是构建高效且资源友好应用的基石之一。本文将深入浅出地介绍如何通过单例模式确保类只有一个实例,并提供一个全局访问点。我们将探索多种实现方法,包括懒汉式、饿汉式和双重校验锁,同时也会讨论单例模式在多线程环境下的表现。无论你是Java新手还是资深开发者,这篇文章都将为你打开一扇理解并有效应用单例模式的大门。
|
设计模式 安全 Java
Singleton单例模式(Java代码实现)——创建型模式
Singleton单例模式(Java代码实现)——创建型模式
160 0
下一篇
无影云桌面