单例模式(Singleton),保证在程序运行期间,一个类在内存中只有一个实例对象,并提供一个全局访问方法。
实现单例模式的核心是私有化构造器

饿汉式,最常用的方式。JVM加载类到内存中时,创建实例,线程安全。

public class Boss
{
    private static final Boss boss = new Boss();

    private Boss(){}

    public static Boss getBoss()
    {
        return boss;
    }
}

懒汉式,存在线程安全问题,一般不用

public class Boss
{
    private static Boss boss;

    private Boss(){}

    public static Boss getInstance()
    {
        if(boss==null)
        {
            boss= new Boss();
        }
        return boss;
    }
}

懒汉式,使用加锁的方式解决线程安全问题。

可以选择同步方法或同步代码块。但是,只有在第一次执行方法时才需要同步,所以,同步方法的写法性能会很差。

用同步代码块,并“双重检查加锁”

public class Boss
{
    private static volatile Boss boss;

    private Boss()){}

    public static Boss getInstance()
    {
        if(boss==null)
        {
            synchronized(Boss.class)
            {
                if(boss==null)
                {
                    boss= new Boss();
                }
            }
        }
        return boss;
    }
}

使用静态内部类,在内部类中持有外部类的实例,从而实现懒加载,并保证线程安全性。

写法不太直观,不常用

public class Boss
{
    private Boss(){}

    private static class BossHolder
    {
        private static final Boss boss = new Boss();
    }

    public static Boss getInstance()
    {
        return BossHolder.boss;
    }
}

终极写法!《Effective Java》中推荐的写法,使用枚举,干净利落!

public enum Boss
{
    INSTANCE
}