一、单例模式简介 单例模式是为保证一个对象,在程序运行的任何时刻只有一个实例存在,我们把这种实现方式称之为“单例模式”。 二、单例模式的核心 单例类只有一个实例存在单例类提供一个全局访问点单例类通过自己创建唯一实例单例类对外所有访问对象都提供一个唯一实例。 三、单例模式的优点 1、在程序运行中只有一个实例,减少内存占用,减少频繁的创建和销毁实例所带来的系统开销,2、避免资源的多种无效占用单例模式缺点:没有接口不能继承 四、单例模式应用场景 当一个事物在特定的环境中,只会存在一个实例时,我们可以采用单例模式对其进行设计。例:数据库连接池,计算机注册表一个国家只有一个总统日志系统中的日志文件计算机中的打印池计算机设备管理器生成唯一序列号网站计数器 五、单例模式的实现方式 1、非线程安全(尽量不要用) publicsealedclassSingleton { privatestaticSingletoninstance=null; privateSingleton() { } publicstaticSingletonInstance { get { if(instance==null) { instance=newSingleton(); } returninstance; } } } 说明:上面的方法是非线程安全的,2个不同的线程可以同时进入这个方法,如果instance为空的并且这里返回真的情况下,都可以创建实例,这显然违反了单例模式,实际上,在测试以前,实例就已经有可能被创建了, 但是内存模型不能保证这个实例能被其他的线程看到,除非合适的内存屏障已经被跨过了。 2、简单的线程安全 publicsealedclassSingleton { privatestaticSingletoninstance=null; privatestaticreadonlyobjectpadlock=newobject(); Singleton() { } publicstaticSingletonInstance { get { lock(padlock) { if(instance==null) { instance=newSingleton(); } returninstance; } } } } 上述实现是线程安全的。这个线程在共享的object上取出了一把锁,然后在创建实例以前检查这个实例是否被创建了。 这个保护了内存屏障问题(lock保证了所有的读取操作是在LOCK获得以后发生的,所有的unlock保证了所有的写操作在lock释放以后发生的),这样就保证了一个线程只能创建一个实例(每次只有一个线程在这段代码中运行),不巧的是,性能上来说,锁变成了每次都必须的当这个实例被响应的时候。 3、尝试线程安全(双重锁定)不推荐使用 publicsealedclassSingleton { privatestaticSingletoninstance=null; privatestaticreadonlyobjectpadlock=newobject(); Singleton() { } publicstaticSingletonInstance { get { if(instance==null) { lock(padlock) { if(instance==null) { instance=newSingleton(); } } } returninstance; } } } 4、不完全lazy,但是线程安全且不用用锁推荐使用 publicsealedclassSingleton { privatestaticreadonlySingletoninstance=newSingleton(); //显示的static构造函数 //没必要标记类型-在field初始化以前 staticSingleton() { } privateSingleton() { } publicstaticSingletonInstance { get { returninstance; } } } 赞赏 长按鍖椾含鐧界櫆椋庡尰闄㈢殑鍦板潃鑷村姏浜庣櫧鐧滈鐨勭爺绌?
|