`
xiaoxiao_0311
  • 浏览: 23392 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单例模式的懒加载-内部类静态变量实现

阅读更多
以前我在使用单例模式时,一般都不是使用的懒加载,
如下:
public class SingletomFactory
{
	private static MySingleton instance = new MySingleton();
	
	public static MySingleton getInstance(){
		return instance;
	}

}

或者使用synchronized直接锁定方法,
如下:
public class SingletomFactory
{
	private static MySingleton instance = null;
	
	public synchronized static MySingleton getInstance(){
		if(instance == null){
			instance = new MySingleton();
		}
		return instance;
	}

}


其中前者没有什么懒加载,这造成了一定资源上的浪费;后者使用了懒加载,但这种懒加载是使用在锁的基础上的,当并发高的时候,会产生阻塞。
后来又发现一种方法,没有使用锁,但确实是懒加载,这就是使用内部类的静态变量初始的单例对象:
public class SingletomFactory
{
	private static class Facotry{
		public static final MySingleton instance = new MySingleton();
	}
	
	public synchronized static MySingleton getInstance(){
		
		return Facotry.instance;
	}

}

注:不要使用什么二重检查锁或多重检查锁,因为一些研究已经证明这种方法不能保证对象能够绝对安全的初始化。详情请看 http://xiaoxiao-0311.iteye.com/blog/1046666
分享到:
评论

相关推荐

    Java单例模式实现静态内部类方法示例

    静态内部类实现单例模式是指在类的内部定义一个静态内部类,该内部类中包含一个静态的实例变量,并在该类的静态块中实例化该变量。外部类通过获取内部类的实例来实现单例模式。 例如,在下面的代码中,我们定义了一...

    egret 单例场景管理类-一个小例子

    2. 创建一个静态变量 `_instance` 来保存单例对象,并提供一个静态方法 `getInstance()` 来获取实例。 ```typescript private static _instance: SceneManager; public static getInstance(): SceneManager { if ...

    单例实现源码singleton-C++

    在软件设计模式中,单例模式是一种常用的模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。在C++中实现单例模式有多种方法,每种方法都有其优缺点。以下是对"单例实现源码singleton-C++"的详细...

    设计模式之单例模式(结合工厂模式)

    静态内部类单例利用Java类加载机制保证了线程安全,而枚举单例则是Java中实现单例的最佳方式,因为它天然支持序列化且防止反射攻击。 在代码实现上,我们可以创建一个名为SingletonFactory的工厂类,其中包含一个...

    2 单例模式-MOOC课程内容.pdf

    当getInstance()方法首次被调用时,SingletonHolder才会被加载,这时内部类SingletonHolder的静态变量INSTANCE也随之被初始化,由于静态变量是线程安全的,因此这样也保证了线程安全。 在选择单例实现方式时,需要...

    单例模式PHP实现代码类.zip

    单例模式是一种设计模式,它控制了类的实例化过程,确保一个类只有一个实例,并提供一个全局访问点。在PHP中,单例模式通常用于管理共享资源,如数据库连接、缓存系统或日志记录,因为这些场景下,创建多个实例可能...

    单例模式分享-吴昌良

    在这个例子中,`test`类实现了单例模式。注意几个关键点: - `__construct`方法是私有的,阻止了外部直接通过`new`创建实例。 - `__clone`方法也是私有的,防止通过克隆的方式创建新实例。 - `getInstance`是一个...

    使用C++11实现线程安全的单例模式

    在C++编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。...在实际项目中,根据具体需求,可以进一步扩展单例模式,例如添加懒加载特性或在析构时进行资源清理。

    单例模式,single

    在这个实现中,`ClassicSingleton` 类包含一个静态成员变量 `instance` 来保存单例对象,并且提供了一个 `getInstance()` 方法供外部调用获取该对象。构造方法被声明为 `protected`,以防止其他类直接实例化这个类。...

    单例模式(Singleton)的6种实现

    通过一个私有的静态内部类SingletonHolder持有单例类的静态变量,利用Java的类加载机制来保证实例的创建过程只有一个线程可以操作,从而保证了线程安全。 每种单例模式实现都有其适用场景,需要根据具体的应用需求...

    单例模式Java实现

    1. **饿汉式(静态常量)**:这是最简单的单例实现方式,它在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快,且线程安全。 ```java public class Singleton { private static final Singleton ...

    设计模式之单例模式源码demo

    1. **饿汉单例模式**:在类加载时就完成初始化,因此静态变量`instance`会随着类的加载而被创建。这种方式线程安全,且因为单例在类加载时已经创建,所以不存在多线程同步问题,但可能会造成内存浪费,因为即使没有...

    单例模式中声明静态自己类型的指针编译显示未定义处理

    1. **正确地初始化静态成员变量**:在单例模式中,静态成员变量通常用来存储单例实例。确保在单例类的cpp文件中,有如下初始化代码: ```cpp // Singleton.h class Singleton { public: static Singleton* ...

    设计模式单例模式

    这种方式在类加载时创建单例,但由于单例创建在静态内部类中,所以只有在调用`getInstance()`时才会加载`SingletonHolder`,实现了延迟初始化,同时也保证了线程安全。 3. **同步枷锁**(Synchronized):在多线程...

    单例模式详解

    在复杂的系统架构中,还需要考虑多线程、多类加载器、跨JVM等特殊场景下的单例模式实现。 通过本文的介绍,我们可以看到单例模式不仅限于一个简单的类实现,还可以根据不同的应用场景进行扩展和优化。在软件开发...

    C++实现的单例模式代码

    这是最简单的单例实现方式,通过类内部定义一个静态私有实例和公有的静态获取实例的方法。如下所示: ```cpp class Singleton { private: Singleton() {} ~Singleton() {} Singleton(const Singleton&) = delete...

    Java设计模式之单例模式的七种写法

    Java 类加载器会先加载静态变量,然后加载对象实例化,最后加载成员变量和方法。 单例模式是一种常见的设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。懒汉式单例是一种常见的单例...

    使用Java单例模式实现一个简单的日志记录器.txt

    通过定义静态变量、私有构造函数以及线程安全的实例获取方法,实现了日志记录器的单例模式。此外,还提供了写入日志的方法,便于实际应用中的日志管理。这种方法简单有效,适合初学者理解和实践。

Global site tag (gtag.js) - Google Analytics