第一种(懒汉,线程不安全):
Java代码
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。
第二种(懒汉,线程安全):
Java代码
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。
第三种(饿汉):
Java代码
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。
第四种(饿汉,变种):
Java代码
public class Singleton {
private Singleton instance = null;
static {
instance = new Singleton();
}
private Singleton (){}
public static Singleton getInstance() {
return this.instance;
}
}
表面上看起来差别挺大,其实更第三种方式差不多,都是在类初始化即实例化instance。
第五种(静态内部类):
Java代码
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第三种和第四种方式不同的是(很细微的差别):第三种和第四种方式是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三和第四种方式就显得很合理。
第六种(枚举):
Java代码
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
第七种(双重校验锁):
Java代码
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
这个是第二种方式的升级版,俗称双重检查锁定
分享到:
相关推荐
文件名 : Singleton1.java 文件名 : Singleton2.java 文件名 : Singleton3.java 文件名 : Singleton4.java 文件名 : Singleton5.java 文件名 : Singleton6.java 文件名 : TestSingleton1.java 文件名 : ...
function constructor() { // All of the normal singleton code goes here. } return { getInstance: function() { if (!uniqueInstance) { // Instantiate only if the instance doesn't exist. ...
Unity Singleton 在Unity中实现单例模式的最佳方法。 通过使用这种模式,您将能够定义Global变量和类,并在Global中使用它们的方法和属性。 对于使用Unity引擎制作的大多数游戏来说,这种模式都是必须的。 :open_...
很多开发人员在刚开始学Python 时,都考虑过像 c++ 那样来实现 singleton 模式,但后来...##----------------------- code begin ----------------------- # -*- coding: utf-8 -*- def singleton(cls): """Define a c
• Explore testing getters/setters, string handling, encapsulation, override variations, visibility, singleton patterns, error conditions, and more • Reproduce and test complex race conditions ...
- **介绍常见的设计模式**:如Singleton单例模式、Factory工厂模式、Decorator装饰模式等。 - **代码重构技巧**:包括如何重构现有代码以提高可读性和可维护性。 - **面向接口编程**:强调接口在软件设计中的重要性...
解决目前memcached不支持hibernate4的缺陷,hibernate配置<property name="hibernate.cache.region.factory_class">com.googlecode.hibernate.memcached.MemcachedRegionFactory</property>
$this->app->singleton('shortcode', function () { return new ShortcodeManager(); }); $this->app->booting(function () { $loader = Illuminate\Foundation\AliasLoader::getInstance(); $loader->alias...
<CodeSnippet Format="1.0.0"> <Header> <Title>simple singleton</Title> <Shortcut>sngltn <Author>Matias Wald <Description>simple singleton pattern </Header> <Object...
创建型模式涉及到对象的实例化过程,比如单例模式(Singleton)、工厂模式(Factory)和抽象工厂模式(Abstract Factory)。它们提供了一种在程序运行时创建对象的最佳方式,降低了对象创建过程的复杂性。 结构型...
1. **单例模式(Singleton)**:确保一个类只有一个实例,并提供全局访问点。常用于配置中心、线程池等场景。 2. **工厂模式(Factory Method)**:定义一个用于创建对象的接口,让子类决定实例化哪一个类。它封装...
创建型模式关注对象的创建过程,如单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。结构型模式涉及类和对象的组合,如适配器(Adapter)、装饰器(Decorator)和桥接(Bridge)。...
EJB 3.0允许使用@Stateless、@Stateful和@Singleton注解来声明无状态、有状态和单例会话Bean,分别对应不同的会话管理需求。 3. **依赖注入(Dependency Injection)**:EJB 3.0支持JSR 330标准的依赖注入,如@...
2. **创建型设计模式**:如工厂模式(Factory)、抽象工厂模式(Abstract Factory)、单例模式(Singleton)、建造者模式(Builder)和原型模式(Prototype)。这些模式关注于对象的创建,使得代码更易于管理,同时...
这个"NET_Remoting_2nd_Code.zip"压缩包可能包含了关于.NET Remoting的示例代码,帮助开发者理解并实践这项技术。 .NET Remoting的核心概念在于创建可序列化和跨进程或跨网络传输的对象实例。它允许对象在本地或...
8. **设计模式**:良好的代码结构通常会运用到设计模式,如单例模式(Singleton)用于确保ChatRoom类只有一个实例,工厂模式(Factory)用于创建对象。 9. **IO与NIO**:Java的New IO(NIO)提供了非阻塞的I/O操作...
- 单例模式(Singleton)确保一个类只有一个实例,并提供全局访问点。 - 工厂方法模式(Factory Method)提供了一个接口用于创建对象,但让子类决定实例化哪个类。 - 抽象工厂模式(Abstract Factory)提供了创建...
例如,创建一个Singleton类,它的构造函数是私有的,只有一个静态方法返回类的实例。 2. **工厂模式**:提供一个接口来创建一系列相关的对象,而无需指定它们的具体类。在AS3中,工厂模式常用于动态创建不同类型的...
干净的代码Python目录职能函数参数(理想情况下为2个或更少) 函数应该做一件事函数名称应说明其作用函数只能是一个抽象级别不要将标志用作函数参数避免副作用不要写全局函数不要使用Singleton模式封装条件避免负面...
1. **单例模式** (Singleton): 在Android系统中,单例模式被广泛应用于资源管理,如SharedPreferences、ContentResolver等。书中的示例可能包含一个全局访问点,确保类的实例只有一个,并提供一个全局访问点。 2. *...