下面通过代码展示单例的4中实现方式
一、饿汉式
package com.geek.jeep.designpattern.singleton;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author geek
* 全局唯一类
* 饿汉式创建
*
* 构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例;
* 考虑对象创建时的线程安全问题;
* 考虑是否支持延迟加载;
* 考虑 getInstance() 性能是否高(是否加锁)。
*/
public class IdGenerator {
private static final IdGenerator instance = new IdGenerator();
AtomicInteger id = new AtomicInteger(0);
private IdGenerator() {}
public static IdGenerator getInstance() {
return instance;
}
public int getId() {
return id.incrementAndGet();
}
//使用方式: long id = IdGenerator.getInstance().getId();
}
二、懒汉式
package com.geek.jeep.designpattern.singleton;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author geek
* 懒汉式:
* 优势:加上了延时加载
* 缺点:引入了 synchronized 变成了串行
*/
public class IdGeneratorLazy {
AtomicLong atomicLong = new AtomicLong(0);
private static IdGeneratorLazy instance;
private IdGeneratorLazy() {
}
public static synchronized IdGeneratorLazy getInstance() {
if (null == instance) {
instance = new IdGeneratorLazy();
}
return instance;
}
public Long getId() {
return atomicLong.incrementAndGet();
}
}
三、双重检测下的懒汉式
package com.geek.jeep.designpattern.singleton;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author geek
* 双重检查的单例
* 优势:既支持 延迟加载 又解决了高并发问题
*
*/
public class IdGeneratorDoubleCheck {
private static volatile IdGeneratorDoubleCheck instance;
AtomicLong atomicLong = new AtomicLong(0);
private IdGeneratorDoubleCheck(){}
public static IdGeneratorDoubleCheck getInstance() {
if (null == instance) {
synchronized (IdGeneratorDoubleCheck.class) {
if (null == instance) {
instance = new IdGeneratorDoubleCheck();
}
}
}
return instance;
}
public Long getId() {
return atomicLong.incrementAndGet();
}
}
四、静态类的方式
package com.geek.jeep.designpattern.singleton;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author geek
* 静态类的单例
*
*/
public class IdGeneratorStatic {
private AtomicLong atomicLong = new AtomicLong(0);
private IdGeneratorStatic(){}
private static class SingletonHolder {
private static final IdGeneratorStatic instance = new IdGeneratorStatic();
}
public IdGeneratorStatic getInstance() {
return SingletonHolder.instance;
}
public Long getId() {
return atomicLong.incrementAndGet();
}
}