单例模式

2021-02-03  本文已影响0人  温驭臣

为什么要使用单例模式?

1,处理资源访问冲突。

2,表示全局唯一类。如果有些数据在系统中只应保存一份,这就适合设计为单例模式。

如何实现一个单例?

1,饿汉式:

public class IdGenerator {

  private AtomicLong id = new AtomicLong(0);

  private static final IdGenerator instance = new IdGenerator();

  private IdGenerator() {}

  public static IdGenerator getInstance() {    return instance;  }

  public long getId() {  return id.incrementAndGet(); }

}

2,懒汉式:

public class IdGenerator {

  private AtomicLong id = new AtomicLong(0);

  private static IdGenerator instance;

  private IdGenerator() {}

  public static synchronized IdGenerator getInstance() {

    if (instance == null) { 

       instance = new IdGenerator(); 

}

    return instance;

}

  public long getId() {return id.incrementAndGet();}

}

3,双重校验:

public class IdGenerator {

  private AtomicLong id = new AtomicLong(0);

  private static IdGenerator instance;

  private IdGenerator() {}

  public static IdGenerator getInstance() {

    if (instance == null) {

      synchronized(IdGenerator.class) { // 此处为类级别的锁

        if (instance == null) { instance = new IdGenerator(); }

      }

    }

    return instance;}

  public long getId() {return id.incrementAndGet();}

}

4,静态内部类:

public class IdGenerator {

  private AtomicLong id = new AtomicLong(0);

  private IdGenerator() {}

  private static class SingletonHolder{

    private static final IdGenerator instance = new IdGenerator();

  }

  public static IdGenerator getInstance() {return SingletonHolder.instance; }

  public long getId() {  return id.incrementAndGet(); }

}

5,枚举:

public enum IdGenerator {

  INSTANCE;

  private AtomicLong id = new AtomicLong(0);

  public long getId() { return id.incrementAndGet(); }

}

上一篇 下一篇

猜你喜欢

热点阅读