`

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

    博客分类:
  • 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 单例模式是一种常用的软件设计模式,在它的可信结构中只包含一个被实例化单例的特殊类。通过单例设计模式可以把整系统中的一个类只有一个实例。单例设计模式又分为两种方式,懒汉式和饿汉式。 懒汉式单例 ...

    C++单例模式懒汉式和饿汉式

    懒汉式单例的特点是在第一次使用时才创建实例,即延迟初始化。这种设计的优点是如果单例类的实例从未被使用,那么系统就不会为其分配内存,节约了资源。然而,懒汉式的缺点在于线程安全性。在多线程环境下,如果没有...

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

    在本案例中,提到的“组态王设备初始化失败安装可用”指的是,当遇到这样的问题时,可以通过安装特定的控件——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版本**: 首先,确保你的...

    爱数-超易备 备份策略提示COM初始化失败:没有注册类.docx

    ### 知识点一:爱数-超易备简介与功能 ...通过以上详细的分析和解决步骤,可以有效地应对爱数-超易备在设置备份策略时遇到的“COM初始化失败:没有注册类”的问题,并采取相应的预防措施以避免类似问题再次发生。

    交互式登录进程初始化失败解决方法.docx

    解决交互式登录进程初始化失败问题的方法 交互式登录进程初始化失败问题是 Windows 操作系统中的一种常见问题,该问题会导致用户无法进入桌面,影响工作和生活的正常进行。本文将对交互式登录进程初始化失败问题的...

    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单例模式[归类].pdf

    懒汉式单例的特点是在类首次被需要时才创建实例,即延迟初始化。这种方式的优点是如果程序始终没有用到单例,就不会创建对象,节省资源。缺点是线程不安全,如果多个线程同时调用`getInstance()`,可能会创建多个...

    Java单例模式.pdf

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

    单例模式讲解

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

    41丨单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?1

    在大多数情况下,单例对象一旦创建后就不会再改变,因此饿汉式在性能上可能更优,因为它避免了同步带来的额外开销。然而,如果系统对资源利用率要求较高,或者单例对象的创建成本较低,那么延迟加载的双重检测锁可能...

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

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

Global site tag (gtag.js) - Google Analytics