Java中的单例一般来说有:饿汉、懒汉(双重检查)、枚举、静态内部类
以下只说同步的:
饿汉模式就是类加载时即创建对象;
private static final User u=new User();然后方法里返回这个就行
懒汉模式就是延迟对象创建,一般是双重检查:
public class Singleton {
private static volatile Singleton instance=null;
private Singleton() {}
public static Singleton getInstance() {
if(instance==null) {
synchronized (Singleton.class) {
if(instance==null)
instance=new Singleton();
}
}
return instance;
}
然后这个双重检查还可以优化一下,effective java上说可以优化25%,在我电脑上大概是16.8%(使用2个线程,每个线程创建500个对象,执行3次取平均值)。优化的原因应该是instance是volatile的,if判断的时候要取来取去的,而它取的性能没那么好。
public static Singleton getInstance2() {
Singleton single=instance;
if(single==null) {
synchronized (Singleton.class) {
//single=instance;这一句书上有,不知道是否必须
if(single==null)
instance=single=new Singleton();//instance赋值必须,不然效率会特别低,原因应该也是跟前面说的有关
}
}
return single;
}
}
静态内部类也是很好的做法:
private static class createSingleton{
private static final Singleton instance=new instance();
}
然后在方法里返回就行。
枚举:前面都要设置构造器私有,枚举自动私有了,其实例也是单例的
class Resource{
}
public enum SomeThing {
INSTANCE;
private Resource instance;
SomeThing() {
instance = new Resource();
}
public Resource getInstance() {
return instance;
}
}