定义

单例模式确保一个类只有一个实例, 并提供一个全局访问点

案例

实现单例模式只需要 私有的构造器, 一个静态方法和一个静态变量

BaseSingleton延迟加载, 存在线程安全问题

  1. public class BaseSingleton {
  2. private static BaseSingleton instanse;
  3. private BaseSingleton() {
  4. }
  5. public static BaseSingleton getInstance() {
  6. if (instanse == null) {
  7. instanse = new BaseSingleton();
  8. }
  9. return instanse;
  10. }
  11. }

解决一: 通过饿汉式, 一开始就初始化

  1. public class HungrySingleton {
  2. private static HungrySingleton instance = new HungrySingleton();
  3. private HungrySingleton() {
  4. }
  5. public HungrySingleton getInstance() {
  6. return instance;
  7. }
  8. }

解决二
SyncSingleton加synchronized关键字
问题: 每次经过getInstance方法都会有同步的性能损耗, 实际只需要在第一次instance为null的时候保证只创建一次就行了

  1. public class SyncSingleton {
  2. private static SyncSingleton instance;
  3. private SyncSingleton() {
  4. }
  5. public synchronized SyncSingleton getInstance() {
  6. if (instance == null) {
  7. instance = new SyncSingleton();
  8. }
  9. return instance;
  10. }
  11. }

解决三
DoubleCheckLockSingleton利用volatile和synchronized双重检查锁, 这样性能上损耗最低, 又是延迟加载线程安全的

  1. public class DoubleCheckLockSingleton {
  2. private volatile static DoubleCheckLockSingleton instance;
  3. private DoubleCheckLockSingleton() {
  4. }
  5. public DoubleCheckLockSingleton getInstance() {
  6. if (instance == null) {
  7. synchronized (DoubleCheckLockSingleton.class) {
  8. if (instance == null) {
  9. instance = new DoubleCheckLockSingleton();
  10. }
  11. }
  12. }
  13. return instance;
  14. }
  15. }