java单例模式

来源:互联网 发布:软件实施心得体会 编辑:程序博客网 时间:2024/06/11 20:44

这里只写两种最常用的方式,且线程安全的:

一、静态内部类方式

public class Singleton {        private static class SingletonHolder {        private static final Singleton INSTANCE = new Singleton();        }        private Singleton (){}      public static final Singleton getInstance() {           return SingletonHolder.INSTANCE;        }    } 

这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程

二、枚举方式

public class SingletonObject {    private SingletonObject(){}    private enum Singleton{        INSTANCE;        private final SingletonObject instance;        Singleton(){            instance=new  SingletonObject();        }        public SingletonObject getInstance(){            return instance;        }    }    public static SingletonObject getInstance(){        return Singleton.INSTANCE.getInstance();    }    public static void main(String[] args){        IntStream.rangeClosed(1,100).forEach(i->new Thread(String.valueOf(i)){            @Override            public void run(){                System.out.println(SingletonObject.getInstance());            }        }.start());    }}
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过要注意enum是1.5版本后才引入的类型