Java单例模式简介
2015-11-06 09:54
477 查看
单例模式是一种常用的软件设计模式,其保证了系统中只有一个实例且可以被访问从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例是最好的解决方案。
单例模式我所知道的共有5种写法:
1懒汉式,线程不安全
/* * 懒汉式单例 * @author:sky_918 */ public class SingletonOne { private static SingletonOne instance=null; public static synchronized SingletonOne getInstance() { if(instance==null) { instance=new SingletonOne(); } return instance; } private SingletonOne(){ } }
这种写法在多线程访问时不能正常工作
2饿汉式,线程安全
package com.sky.killserver; /* * 饿汉式 * @author:sky_918 * 对第一行static的解释 *java允许我们在一个类里面定义静态类。比如内部类(nested class)。 把nested class封闭起来的类叫外部类。 在java中,我们不能用static修饰顶级类(top level class)。 只有内部类可以为static。 */ public class SingletonTwo { public static class Singleton{ //在自己内部定义自己的一个实例,只供内部调用 private static final Singleton instance = new Singleton(); private Singleton(){ //do something } //这里提供了一个供外部访问本class的静态方法,可以直接访问 public static Singleton getInstance(){ return instance; } } }
这种写法虽然解决了线程安全问题,但是不高效,任何时候只能有一个线程调用它。
3双重锁检验锁模式
4静态内部类
5枚举
但是单例模式是怎么只创造一个对象的呢?
构造函数是在创建对象的时候随对象的加载而加载的,用来给对象进行初始化,如果所有构造函数都被private了,就不能在其他的类访问到,也就不能在其他的类中创建对象了(平时没自定义构造函数是因为系统默认添加了一个空参数的构造函数,所以也可以创建对象),而只能在本类中创建对象。
private final Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; }
这个代码就是在本类中创建了一个对象new Singleton()然后把这个对象的引用(就是对象在堆内存中的地址值)给了instance,
然后再通过getInstance()这个方法把instance持有的引用给了调用此方法的人,也就是obj(注意这个变量名是Singleton类类型的),obj只是和instance同时持有了new Singleton()这个对象的引用,而不是obj也创建了一个对象。
使用的时候是这句代码
Singleton obj = Singleton.getInstance();就是这样。
这里附上参考的资料博客:http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern/这里有其他3种我没有附上代码的单例写法
http://bbs.csdn.net/topics/390753067
相关文章推荐
- 记两个自己查找错误粗心的地方
- java--------动态的经典例题
- java内存分配和String类型的深度解析
- mac下安装和使用eclipse出现的问题
- java6 原生webService注解应用
- JAVA中怎样处理InterruptedException
- MyEclipse使用快捷方式查找类和文件等资源
- Java NIO使用及原理分析(二)
- MyEclipse快捷键
- JAVA项目开发中常用软件的安装配置
- 基于java配置启动spring容器
- 常用java字符串处理
- Java类加载与卸载
- spring aop搭建(2) :基于代码的实现
- HibernateDao.java
- maven项目下solr和spring的整合配置
- 【JAVA大作业开发记录(二)】
- myeclipse 安装-破解-bug修复过程
- java虚拟机内存不足,“Could not create the Java Virtual Machine”问题解决方案
- 老调重弹之Java引用类型