思考一个问题,以下代码是一个简单的饿汉式单例代码,显然在第一次初始化的时候会发生错误,导致单例的实例化失败,那么失败后可否继续尝试实例化呢?还是说下次使用时直接返回错误的对象或异常呢?
环境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版本**: 首先,确保你的...
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()); ...
饿汉式是在类加载时就完成了初始化,因此它是线程安全的。代码如下: ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static ...
懒汉式单例的特点是在类首次被使用时才创建实例,即延迟初始化。这种方式的优点是如果程序始终没有使用到单例,那么就不会创建对象,节省资源。但是,懒汉式单例在多线程环境下可能存在问题,因为多个线程可能同时...
饿汉式单例与懒汉式的区别主要在于实例化的时机。饿汉式单例在类加载时就会创建实例。下面是一个简单的饿汉式单例实现示例: ```java public class EagerSingleton { private static final EagerSingleton m_...
VS200X应用程序初始化失败的解决方法
更新了一个有关windows 7的补丁后,虚拟机运行脚本的时候就出现了socket端口初始化失败问题,下载后双击即可解决
饿汉式单例模式与懒汉式相反,在类加载的时候就完成了初始化,因此没有线程同步问题。这种方式的缺点是不管是否需要实例,都会在加载时创建,可能会造成内存浪费。 #### 示例代码分析 ```java public class ...
一、单例模式的介绍 二、单例模式的特点 三、单例模式的应用 四、单例模式使用的注意 五、单例模式的举例
DCL单例模式结合了饿汉模式的效率和懒汉模式的延迟初始化。它在多线程环境下解决了懒汉模式的问题,避免了同步的性能开销。代码示例: ```java public class Singleton { private volatile static Singleton ...