为什么要使用单例模式?
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(); }
}
网友评论