【设计模式】 单例模式的几种写法
来源:互联网 发布:js在字符串中查找字符 编辑:程序博客网 时间:2024/06/05 09:59
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
在使用懒汉式的单例方法时,如果我们的程序是多线程的,可能会出现第一个线程判断不存在,则创建,在创建过程中,第二个线程来方法也判断不存在,同样创建。这样就会存在两个实例,所以将该方法设置为同步方法,看下面的代码.
如果我们还想要提高效率,可以试一试双重检查.看代码.
其实,GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。
在应用系统开发中,我们常常有以下需求:
-在多个线程之间,共享同一个资源或者操作同一个对象
-在整个程序空间使用全局变量,共享资源
-大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。
因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。
首先是我们熟悉的饿汉式和懒汉式的写法
//饿汉式public class Person {//在类初始化的时候就完成了对象的实例化。public static final Person person = new Person();private String name;//省略get/set方法//构造函数私有化private Person() {}//提供一个全局的静态方法public static Person getPerson() {return person;}}
//懒汉式public class Person {private String name;private static Person person;//构造函数私有化private Person() {}//提供一个全局的静态方法public static Person getPerson() {//在使用该对象的时候如果不存在则进行创建if(person == null) {person = new Person();}return person;}
在使用懒汉式的单例方法时,如果我们的程序是多线程的,可能会出现第一个线程判断不存在,则创建,在创建过程中,第二个线程来方法也判断不存在,同样创建。这样就会存在两个实例,所以将该方法设置为同步方法,看下面的代码.
public synchronized static Person getPerson() {//在使用该对象的时候如果不存在则进行创建 if(person == null) { person = new Person();}return person;}
细心的你一定会看到其实只是加入了synchronized来保证方法的同步.
其实在执行这个方法的时候,更多的时候我们是在判断对象是否存在,而不是在创建对象.将判断对象是否存在也放到同步方法中,势必会导致效率降低.所以我们只对实例化方法进行同步.
public static Person getPerson() {if(person == null) {synchronized(Person.class){ person = new Person();}}return person;}
如果我们还想要提高效率,可以试一试双重检查.看代码.
public static Person getPerson() {if(person == null) {synchronized (Person.class) {if(person == null) {person = new Person();}}}return person;}
以上就是单例模式的几种写法.
阅读全文
1 0
- 设计模式之单例模式的几种写法
- 【设计模式】 单例模式的几种写法
- Java单例设计模式的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- 单例模式、的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- 单例模式的几种写法
- iOS 开发中如何隐藏UINavigationBar
- 欢迎使用CSDN-markdown编辑器
- 同一页面的两个Iframe获取数据
- 解决服务器返回错误数据格式导致Json解析出错造成app崩溃
- zepto源码之callbacks.js
- 【设计模式】 单例模式的几种写法
- fsck 用法总结
- Cocos2dx 3.10使用using namespace CocosDenshion;错误提示,解决方法
- SSM框架——详细整合教程
- Kotlin中使用Dagger2 可能导致错误"Dagger does not support injection into private fields"
- [LeetCode]110. Balanced Binary Tree
- 剑指offer:变态跳台阶
- 圈复杂度
- Spring Transaction详解