`

关于饿汉式单例首次初始化失败后,可以再次尝试?

    博客分类:
  • jdk
 
阅读更多

思考一个问题,以下代码是一个简单的饿汉式单例代码,显然在第一次初始化的时候会发生错误,导致单例的实例化失败,那么失败后可否继续尝试实例化呢?还是说下次使用时直接返回错误的对象或异常呢?

 

环境HotSpotJVM 1.6

 

/**

*

* @author lidongbo

* @date 2012-7-11

*/

public class Foo {

 

    private static final Foo foo = new Foo();

   

    private static int count = 0;

   

    private Foo(){

       init();

    }

   

    private void init(){

       //do sth.

       if(count == 0){

           //制造一个空指针

           System.out.println(foo.hashCode());

       }else{

           System.out.println("实例化成功!");

       }

       count++;

    }

   

    public static final Foo getInstance(){

       return foo;

    }

   

}

 

 

/**

 *

 * @author lidongbo

 * @date 2012-7-11

 */

public class Test {

 

    public static void main(String[] args) {

 

       try {

           System.out.println(Foo.getInstance());

       } catch (Throwable e) {

           e.printStackTrace();

       }

       System.out.println("-------------1-----------------");

       try {

           System.out.println(Foo.getInstance());

       } catch (Throwable e) {

           e.printStackTrace();

       }

       System.out.println("-------------2-----------------");

    }

 

}

 

 

答案揭晓:

再第二此实例的时候,JVM直接异常给我们了.

 

java.lang.ExceptionInInitializerError

    at Test.main(Test.java:13)

Caused by: java.lang.NullPointerException

    at Foo.init(Foo.java:19)

    at Foo.<init>(Foo.java:12)

    at Foo.<clinit>(Foo.java:9)

    ... 1 more

java.lang.NoClassDefFoundError: Could not initialize class Foo

    at Test.main(Test.java:19)

-------------1-----------------

-------------2-----------------

1
1
分享到:
评论

相关推荐

    使用单例模式创建学生管理系统(饿汉式、懒汉式)

    饿汉式单例在类加载时就完成了实例化,因此它是线程安全的。这种方式保证了单例的唯一性,同时也避免了同步带来的性能开销。以下是饿汉式单例模式的Java代码实现: ```java public class Singleton { // 饿汉式:...

    设计模式——单例模式

    饿汉式单例模式在类加载时就完成了实例化,因此也称为静态初始化。这种方式保证了线程安全,但可能会造成不必要的资源浪费,因为即使未使用,单例对象也会被创建。 ```java public class Singleton { private ...

    java 单例模式(懒汉式与饿汉式)

    Java 单例模式是一种常用的软件设计模式,在它的可信结构中只包含一个被实例化单例的特殊类。通过单例设计模式可以把整系统中的一个类只有一个实例。单例设计模式又分为两种方式,懒汉式和饿汉式。 懒汉式单例 ...

    组态王设备初始化失败安装可用

    在本案例中,提到的“组态王设备初始化失败安装可用”指的是,当遇到这样的问题时,可以通过安装特定的控件——MsComm32来解决。 MsComm32控件是Microsoft通信控件的一个版本,主要用于串行通信(COM端口)操作。在...

    Qt qml Singleton 单例模式

    - 如果Singleton需要在C++中初始化,可以使用`setObject`方法在C++侧设置Singleton的实例。 综上所述,Qt Qml的Singleton模式为全局共享对象提供了方便,使得在Qml环境中管理和访问同一对象变得简单。通过C++和Qml...

    Android单例模式

    饿汉式单例模式的特点是在类初始化时即创建实例,因此天生具备线程安全性。 ##### 实现代码示例 ```java public class Singleton1 { private Singleton1() {} private static final Singleton1 single = new ...

    Win10关于易语言提示运行时出错初始化DirectX运行库失败问题的解决

    "初始化DirectX运行库失败"是其中一个常见的错误提示,意味着系统缺少必要的DirectX组件或者相关的驱动程序不兼容。为了解决这个问题,我们可以按照以下步骤进行操作: 1. **检查DirectX版本**: 首先,确保你的...

    java + 单例模式 + 懒汉式 + 资源

    1. **初始化时机**:饿汉式在类加载时初始化,懒汉式在首次调用getInstance()时初始化。 2. **线程安全性**:饿汉式天生线程安全,懒汉式如果不采用同步控制则不是线程安全的。 3. **资源消耗**:饿汉式可能造成资源...

    Win7 64位操作系统无法连接Wince设备驱动程序,提示ActiveSync 引导程序初始化失败

    vs开发工具错误提示:ActiveSync 引导程序初始化失败。请连接/配备一个实际的设备,或者从 http://go.microsoft.com/fwlink?linkid=67763 下载用户级 Windows Mobile Device Center 应用程序 Device Connectivity ...

    三菱 初始化失败 解决文件

    创建新工程失败的解决办法,此办法限仅于解决“创建新工程失败”

    java单例设计模式-饿汉式-懒汉式 (2).pdf

    饿汉式在类加载时即创建单例对象,因此在类加载阶段就已经完成了初始化。由于类加载是线程安全的,所以饿汉式天生就是线程安全的。它的实现代码如下: ```java public class Singleton { private static final ...

    C#单例模式详解 C#单例模式详解C#单例模式详解

    .NET框架提供了一个内置的Lazy类,可以方便地实现线程安全的延迟初始化单例。 ```csharp public class Singleton { private static readonly Lazy&lt;Singleton&gt; lazy = new Lazy(() =&gt; new Singleton()); ...

    java单例设计模式-饿汉式-懒汉式.docx

    饿汉式是在类加载时就完成了初始化,因此它是线程安全的。代码如下: ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static ...

    Java单例模式.pdf

    懒汉式单例的特点是在类首次被使用时才创建实例,即延迟初始化。这种方式的优点是如果程序始终没有使用到单例,那么就不会创建对象,节省资源。但是,懒汉式单例在多线程环境下可能存在问题,因为多个线程可能同时...

    单例模式讲解

    饿汉式单例与懒汉式的区别主要在于实例化的时机。饿汉式单例在类加载时就会创建实例。下面是一个简单的饿汉式单例实现示例: ```java public class EagerSingleton { private static final EagerSingleton m_...

    VS200X应用程序初始化失败的解决方法

    VS200X应用程序初始化失败的解决方法

    解决soket初始化失败问题

    更新了一个有关windows 7的补丁后,虚拟机运行脚本的时候就出现了socket端口初始化失败问题,下载后双击即可解决

    几种单例模式说明(并有实例)

    饿汉式单例模式与懒汉式相反,在类加载的时候就完成了初始化,因此没有线程同步问题。这种方式的缺点是不管是否需要实例,都会在加载时创建,可能会造成内存浪费。 #### 示例代码分析 ```java public class ...

    JAVA单例模式

    一、单例模式的介绍 二、单例模式的特点 三、单例模式的应用 四、单例模式使用的注意 五、单例模式的举例

    单例模式(饿汉模式、懒汉模式、DCL单例模式、枚举)

    DCL单例模式结合了饿汉模式的效率和懒汉模式的延迟初始化。它在多线程环境下解决了懒汉模式的问题,避免了同步的性能开销。代码示例: ```java public class Singleton { private volatile static Singleton ...

Global site tag (gtag.js) - Google Analytics