单例模式写法
来源:互联网 发布:传感器数据采集系统 编辑:程序博客网 时间:2024/05/20 18:05
1.懒汉,线程不安全
public class Singleton {private static Singleton instance=null;private Singleton(){}public static Singleton getInstance(){if(instance==null)instance=new Singleton();return instance;}}
2.懒汉,线程安全
public class Singleton {private static Singleton instance=null;private Singleton(){}public synchronized static Singleton getInstance(){if(instance==null)instance=new Singleton();return instance;}}
public class Singleton {private static Singleton instance=new Singleton();private Singleton(){}public static Singleton getInstance(){return instance;}}
4.饿汉 第二种写法,采用静态构造代码块来实例化单例
public class Singleton {private static Singleton instance=null;static{instance=new Singleton();}private Singleton(){}public static Singleton getInstance(){return instance;}}
5.静态内部类,该方法与饿汉一样都是采用类加载机制来实现单例,不同的是加载Singleton类并不会导致instance初始化,而只有调用getInstance方法后,加载SingltonHolder类才初始化instance,从而达到和懒汉方式一样懒加载效果
public class Singleton {private Singleton(){}public static Singleton getInstance(){return SingltonHolder.instance;}private static class SingltonHolder{private static final Singleton instance=new Singleton();}}
6.双重校验锁,这是第二种的升级版,细化加锁时机,避免不必要的加锁,从而提升效率,注意要加volatile关键字
public class Singleton {/**注意要加上volatile假设没有关键字volatile的情况下,两个线程A、B,都是第一次调用该单例方法,线程A先执行instance = new Instance(),该构造方法是一个非原子操作,编译后生成多条字节码指令,由于JAVA的指令重排序,可能会先执行instance的赋值操作,该操作实际只是在内存中开辟一片存储对象的区域后直接返回内存的引用,之后instance便不为空了,但是实际的初始化操作却还没有执行,如果就在此时线程B进入,就会看到一个不为空的但是不完整(没有完成初始化)的Instance对象,所以需要加入volatile关键字,禁止指令重排序优化,从而安全的实现单例。**/private volatile static Singleton instance=null;private Singleton(){}public static Singleton getInstance(){if(instance==null){synchronized (Singleton.class) {if(instance==null)instance=new Singleton();}}return instance;}}
0 0
- 单例模式写法
- 单例模式写法
- 单例模式写法
- 单例模式写法
- 单例模式的写法
- 模版单例模式写法
- 单例模式的写法
- 单例模式最佳写法
- 单例模式的写法
- 单例模式的写法
- 单例模式枚举写法
- java单例模式写法
- 单例模式的写法
- 单例模式的写法
- 单例模式常用写法
- c++ 单例模式写法
- java单例模式单写法
- 单例模式的7种写法
- FaceBook/atc 环境搭建的总结
- python学习5
- Matlab实现数值微分
- Python http请求(读取代理ip列表)
- 疯狂Android讲义第19章web应用部署
- 单例模式写法
- sqrt函数的实现
- 3942: [Usaco2015 Feb]Censoring KMP
- 豆瓣FM歌曲播放圆形进度的实现
- ELK(五)ElasticSearch常用命令
- C++字符串学习(一)
- Eclipse下安装Hibernate
- CentOS 6.7下Android SDK adb 命令报错的解决方法
- 4419: [Shoi2013]发微博 set