思考一个问题,以下代码是一个简单的饿汉式单例代码,显然在第一次初始化的时候会发生错误,导致单例的实例化失败,那么失败后可否继续尝试实例化呢?还是说下次使用时直接返回错误的对象或异常呢?
环境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-----------------
分享到:
相关推荐
饿汉式单例在类加载时就完成了实例化,因此它是线程安全的。这种方式保证了单例的唯一性,同时也避免了同步带来的性能开销。以下是饿汉式单例模式的Java代码实现: ```java public class Singleton { // 饿汉式:...
饿汉式单例模式在类加载时就完成了实例化,因此也称为静态初始化。这种方式保证了线程安全,但可能会造成不必要的资源浪费,因为即使未使用,单例对象也会被创建。 ```java public class Singleton { private ...
Java 单例模式是一种常用的软件设计模式,在它的可信结构中只包含一个被实例化单例的特殊类。通过单例设计模式可以把整系统中的一个类只有一个实例。单例设计模式又分为两种方式,懒汉式和饿汉式。 懒汉式单例 ...
懒汉式单例的特点是在第一次使用时才创建实例,即延迟初始化。这种设计的优点是如果单例类的实例从未被使用,那么系统就不会为其分配内存,节约了资源。然而,懒汉式的缺点在于线程安全性。在多线程环境下,如果没有...
在本案例中,提到的“组态王设备初始化失败安装可用”指的是,当遇到这样的问题时,可以通过安装特定的控件——MsComm32来解决。 MsComm32控件是Microsoft通信控件的一个版本,主要用于串行通信(COM端口)操作。在...
- 如果Singleton需要在C++中初始化,可以使用`setObject`方法在C++侧设置Singleton的实例。 综上所述,Qt Qml的Singleton模式为全局共享对象提供了方便,使得在Qml环境中管理和访问同一对象变得简单。通过C++和Qml...
饿汉式单例模式的特点是在类初始化时即创建实例,因此天生具备线程安全性。 ##### 实现代码示例 ```java public class Singleton1 { private Singleton1() {} private static final Singleton1 single = new ...
"初始化DirectX运行库失败"是其中一个常见的错误提示,意味着系统缺少必要的DirectX组件或者相关的驱动程序不兼容。为了解决这个问题,我们可以按照以下步骤进行操作: 1. **检查DirectX版本**: 首先,确保你的...
### 知识点一:爱数-超易备简介与功能 ...通过以上详细的分析和解决步骤,可以有效地应对爱数-超易备在设置备份策略时遇到的“COM初始化失败:没有注册类”的问题,并采取相应的预防措施以避免类似问题再次发生。
解决交互式登录进程初始化失败问题的方法 交互式登录进程初始化失败问题是 Windows 操作系统中的一种常见问题,该问题会导致用户无法进入桌面,影响工作和生活的正常进行。本文将对交互式登录进程初始化失败问题的...
1. **初始化时机**:饿汉式在类加载时初始化,懒汉式在首次调用getInstance()时初始化。 2. **线程安全性**:饿汉式天生线程安全,懒汉式如果不采用同步控制则不是线程安全的。 3. **资源消耗**:饿汉式可能造成资源...
vs开发工具错误提示:ActiveSync 引导程序初始化失败。请连接/配备一个实际的设备,或者从 http://go.microsoft.com/fwlink?linkid=67763 下载用户级 Windows Mobile Device Center 应用程序 Device Connectivity ...
创建新工程失败的解决办法,此办法限仅于解决“创建新工程失败”
饿汉式在类加载时即创建单例对象,因此在类加载阶段就已经完成了初始化。由于类加载是线程安全的,所以饿汉式天生就是线程安全的。它的实现代码如下: ```java public class Singleton { private static final ...
.NET框架提供了一个内置的Lazy类,可以方便地实现线程安全的延迟初始化单例。 ```csharp public class Singleton { private static readonly Lazy<Singleton> lazy = new Lazy(() => new Singleton()); ...
懒汉式单例的特点是在类首次被需要时才创建实例,即延迟初始化。这种方式的优点是如果程序始终没有用到单例,就不会创建对象,节省资源。缺点是线程不安全,如果多个线程同时调用`getInstance()`,可能会创建多个...
懒汉式单例的特点是在类首次被使用时才创建实例,即延迟初始化。这种方式的优点是如果程序始终没有使用到单例,那么就不会创建对象,节省资源。但是,懒汉式单例在多线程环境下可能存在问题,因为多个线程可能同时...
饿汉式单例与懒汉式的区别主要在于实例化的时机。饿汉式单例在类加载时就会创建实例。下面是一个简单的饿汉式单例实现示例: ```java public class EagerSingleton { private static final EagerSingleton m_...
在大多数情况下,单例对象一旦创建后就不会再改变,因此饿汉式在性能上可能更优,因为它避免了同步带来的额外开销。然而,如果系统对资源利用率要求较高,或者单例对象的创建成本较低,那么延迟加载的双重检测锁可能...
VS200X应用程序初始化失败的解决方法