单例模式介绍(Singleton)
单例模式的作用就是保证某个类的实例在系统中仅仅只会存在一个。
实现: 将类的默认构造方法设置为私有,然后在类的一个静态方法中创建一个该类的静态实例。
也就是由类自己来控制实例的创建,而客户端只能获取。
代码 Java
package com.henvealf.designpatterns.singleton;
/**
* 单例模式。。。
* Created by henvealf on 16-12-17.
*/
public class Singleton {
private static Singleton singleton = null;
private Singleton() {}
public Singleton getInstance() {
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
多线程的单例
当多个线程同时通过单例类来创建获取实例的时候,可能会发生创建多个实例的情况。
比如有两个线程同时进入了 if 判断,那么这两个线程就会分别创建并获取不同的Singleton实例。
这时候很明显就是为 getInstance 方法设置为临界区,也就是加锁。
代码 Java
package com.henvealf.designpatterns.singleton;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 线程同步的单例模式。
* Created by henvealf on 16-12-17.
*/
public class SyncSingleton {
private static SyncSingleton singleton = null;
// 锁
private Lock lock = new ReentrantLock();
private SyncSingleton() {}
public SyncSingleton getInstance() {
// 双重锁定,只有当实例不存在时才对方法加锁。
// 双重解释分析: 如果 singleton == null 且现在有两个线程进入了 if 判断中,
// 第一个线程获得锁后就进入去创建一个实例,
// 第二个线程在第一个线程释放锁后,如果没有里面的 if 判断,
// 那第二个线程就会再创建一个实例。就达不到单例模式的目的了。
if(singleton == null) {
try {
lock.lock();
if(singleton == null) {
singleton = new SyncSingleton();
}
} finally {
lock.unlock();
}
}
return singleton;
}
}
使用静态初始化来实现单例
实现很简单,在类加载时就会将实例创建好。
代码 Java
package com.henvealf.designpatterns.singleton;
/**
* 在类加载时就会将实例创建好。
* Created by henvealf on 16-12-17.
*/
public final class StaticSingleton {
private static final StaticSingleton staticSingleton = new StaticSingleton();
private StaticSingleton() {
}
public StaticSingleton getInstance() {
return staticSingleton;
}
}
End!!