定义:确保一个类只有一个实例,并提供全局访问节点。
?
public class Singleton {
?
????//定义一个全局的静态对象
????private static Singleton mSingleton = null;
????
????//默认构造方法访问权限设置为Private,不提供外部范围
????private Singleton(){
????????
????}
????
????//定义Public的getInstance方法,提供唯一的外部访问接口
????public static Singleton getInstance(){
????????if(mSingleton == null)
????????????mSingleton = new Singleton();
????????return mSingleton;
????}
}????
通过以上代码我们就实现了单件模式,是不是非常简单呢?这样就可以让一个类提供唯一的对象。注意,如果你写的单件模式用于多线程中,这样的写法并不安全。那么我们应该怎么写呢?别急,马上为你揭晓。
public class Singleton {
?
????//定义一个全局的静态对象
????private static Singleton mSingleton = null;
????
????//默认构造方法访问权限设置为Private,不提供外部范围
????private Singleton(){
????????
????}
????
????//定义Public的getInstance方法,提供唯一的外部访问接口
????public static synchronized Singleton getInstance(){
????????if(mSingleton == null)
????????????mSingleton = new Singleton();
????????return mSingleton;
????}
}
仔细观察发现,我们只在getInstance方法中加入了synchronized关键字,这样迫使每一个线程访问此方法之前,要先等候别的线程离开。也就是说不会有两个或以上的线程同时访问这个方法,这个时候同步此方法就变得很累赘,也是不好的设计。还有改进的空间吗?
public class Singleton {
?
????//定义一个全局的静态对象
????private static Singleton mSingleton = new Singleton();
????
????//默认构造方法访问权限设置为Private,不提供外部范围
????private Singleton(){
????????
????}
????
????//定义Public的getInstance方法,提供唯一的外部访问接口
????public static Singleton getInstance(){
????????return mSingleton;
????}
}
在静态初始化器中创建单件,这段代码保护了线程的安全,不就完美解决问题了吗?如果你不想在静态器中创建单件,那么接下来双重加锁的方法,可以为你提供良好解决办法。
public class Singleton {
?
????// 定义一个全局的静态对象
????private static volatile Singleton mSingleton = new Singleton();
?
????// 默认构造方法访问权限设置为Private,不提供外部范围
????private Singleton() {
?
????}
?
????// 定义Public的getInstance方法,提供唯一的外部访问接口
????public static Singleton getInstance() {
????????if (mSingleton == null) {
????????????synchronized (Singleton.class) {
????????????????if (mSingleton == null)
????????????????????mSingleton = new Singleton();
????????????}
????????}
????????return mSingleton;
????}
}
原文:http://www.cnblogs.com/jaden/p/4358430.html