java线程安全的单例模式
2015-06-30 11:39
766 查看
public class SingleInstance { //此处使用vlatile关键字修饰 instance,确保instance对于每个线程都可见, //即每个线程都能拿到最新的instance的值。 private volatile static SingleInstance instance; private SingleInstance(){} public static SingleInstance getInstance(){ if(null == instance){ //使用全局类锁,保证同步 synchronized (SingleInstance.class) { //避免重复创建对象提高效率 if(null == instance){ instance = new SingleInstance(); } } } return instance; } }JVM编译的过程中会出现指令重排的优化过程,这就会导致当 instance实际上还没初始化,就可能被分配了内存空间,也就是说会出现 instance !=null 但是又没初始化的情况,这样就会导致返回的 instance 不完整第二种使用内部类
public class SingletonInner {/*** 内部类实现单例模式* 延迟加载,减少内存开销** 类级内部类相当于其外部类的static成员,它的对象与外部类对象间不存在依赖关系,* 相互独立,因此可直接创建。而对象级内部类的实例,是必须绑定在外部对象实例上的。* 类级内部类只有在第一次被使用的时候才被会装载** @author xuzhaohu**/private static class SingletonHolder {private static SingletonInner instance = new SingletonInner();}/*** 私有的构造函数*/private SingletonInner() {}public static SingletonInner getInstance() {return SingletonHolder.instance;}protected void method() {System.out.println("SingletonInner");}}
相关文章推荐
- springmvc+spring data 在用EntityManager类的query.getResultList()类型转换
- 阿里云部署java环境
- java 使用new新建一个对象时的操作过程
- java 语言的基础
- spring配置多数据源
- Java笔记之MD5加密
- struts2整合spring 注解方式 注入为空问题原因之一
- java中的static关键字
- maven +Myeclipse 打包
- Java中Runnable和Thread的区别
- eclipse开发jsp环境的插件
- How to write UTF-8 encoded data into a file – Java
- 打开myeclipse 里面有些类报错 再删个空格再保存就ok
- springMVC+Hibernate的配置
- spring JPA使用
- JAVA中重写equals()方法为什么要重写hashcode()方法说明
- Eclipse 中 program arguments 与 VM arguments 的区别
- Java finalize以及Garbage Collection
- 理解Java对象序列化
- java中的sleep()和wait()的区别