单例模式的个人解析
单例模式是一种常用的软件设计模式,其保证了系统中只有一个实例且可以被访问从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例是最好的解决方案。
单例模式我所知道的共有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了,就不能在其他的类访问到,也就不能在其他的类中创建对象了(平时没自定义构造函数是因为系统默认添加了一个空参数的构造函数,所以也可以创建对象),而只能在本类中创建对象。
这个代码就是在本类中创建了一个对象new Singleton()然后把这个对象的引用(就是对象在堆内存中的地址值)给了instance,
然后再通过getInstance()这个方法把instance持有的引用给了调用此方法的人,也就是obj(注意这个变量名是Singleton类类型的),obj只是和instance同时持有了new Singleton()这个对象的引用,而不是obj也创建了一个对象。
private final Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
这个代码就是在本类中创建了一个对象new Singleton()然后把这个对象的引用(就是对象在堆内存中的地址值)给了instance,
然后再通过getInstance()这个方法把instance持有的引用给了调用此方法的人,也就是obj(注意这个变量名是Singleton类类型的),obj只是和instance同时持有了new Singleton()这个对象的引用,而不是obj也创建了一个对象。
使用的时候是这句代码
这里附上参考的资料博客:http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern/这里有其他3种我没有附上代码的单例写法
Singleton obj = Singleton.getInstance();
就是这样。这里附上参考的资料博客:http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern/这里有其他3种我没有附上代码的单例写法
http://bbs.youkuaiyun.com/topics/390753067