重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了“java怎么实现单例模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java怎么实现单例模式”吧!
目前创新互联建站已为上1000家的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器租用、企业网站设计、万载网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
某个类只能有一个实例
构造器私有化
它必须自行创建这个实例
含有一个该类的静态变量来保存这个唯一实例
必须自行先整个系统提供这个实例
对外提供获取该实例对象的方式
直接暴露
用静态变量的 get 方法获取
饿汉式:直接创建对象不存在线程安全问题
直接实例化饿汉式(简洁直观)
枚举式(最简洁)
静态代码块饿汉式(适合复杂实例化)
懒汉式:延迟创建对象
线程不安全(适用于单线程)
线程安全(适用于多线程)
静态内部列形式(适用于多线程)
直接实例化对象,不管是否需要这个对象-饿汉式
/* * 饿汉式 *(1)构造器私有化 *(2)自行创建,并用静态变量保存 *(3)向外提供这个实例 *(4)强调这是单例,用final修饰(这个变量只能赋值一次,之后不能修改) */ public class Singleton1 { public static final Singleton1 INSTANCE = new Singleton1(); private Singleton1 (){ } }
枚举-jdk1.5之后-饿汉式
/* *饿汉式 *枚举类型:表示该类型的对象是有限的几个 *我们可以限定为一个,就成了单例 */ public enum Singleton2{ INSTANCE }
静态代码块-饿汉式
/* * 这种方式,适合那种需要从配置文件里面读一堆信息来实例化。 */ public class Singleton3 { public static final Singleton3 INSTANCE; private String info; static { try { Properties pro = new Properties(); // 从位于src目录下的配置文件single.properties中读取信息 pro.load(Sinfleton3.class.getClassLoader().getResourceAsStream("single.properties")); INSTANCE = new Singleton3(pro.getPropertied("info")); }catch(IOExcepption e){ throw new RuntimeException(e); } } private Singleton3 (String info){ this.info = info; } }
4.线程不安全(适合单线程)-懒汉式
/* * 懒汉式 *(1)构造器私有化 *(2)静态变量保存 *(3)提供一个静态方法,获取实例对象 */ public class Singleton4 { private static Singleton4 instance; private Singleton4 (){ } public static Singleton4 getInstance(){ if(instance == null){ //加上Thread.sleep(100);多线程情况下 会实例化两个对象。 instance = new Singleton4(); } return instance; } }
线程安全(适合多线程)-懒汉式
/* * 懒汉式 *(1)构造器私有化 *(2)静态变量保存 *(3)提供一个静态方法,获取实例对象 */ public class Singleton5 { private static Singleton5 instance; private Singleton5 (){ } public static Singleton5 getInstance(){ if(instance == null){//先判断是否为空,再进行加锁。 synchronized(Singleton5.class){ //加上Thread.sleep(100);多线程情况下 会实例化两个对象。 instance = new Singleton5(); } } return instance; } }
静态内部类形式
/* * 再内部类被加载和初始化时,才创建INSTANCE实例对象 * 静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的 * 因为是在内部类加载和初始化是,创建的,因此是线程安全的。 */ public class Singleton6 { private Singleton6 (){ } private static class Inner{ private static final Singleton6 INSTANCE = new Singleton6(); } public static Singleton6 getInstance(){ return Inner.INSTANCE; } }
感谢各位的阅读,以上就是“java怎么实现单例模式”的内容了,经过本文的学习后,相信大家对java怎么实现单例模式这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!