甘肃网站建设,上传视频网站开发,西安知名高端网站建设服务企业,移动互联网开发技术学什么个人简介#xff1a;Java领域新星创作者#xff1b;阿里云技术博主、星级博主、专家博主#xff1b;正在Java学习的路上摸爬滚打#xff0c;记录学习的过程~ 个人主页#xff1a;.29.的博客 学习社区#xff1a;进去逛一逛~ 单例设计模式 Java单例设计模式 Java单例设计模… 个人简介Java领域新星创作者阿里云技术博主、星级博主、专家博主正在Java学习的路上摸爬滚打记录学习的过程~ 个人主页.29.的博客 学习社区进去逛一逛~ 单例设计模式 Java单例设计模式 Java单例设计模式
单例设计模式Singleton单例即唯一实例某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。例如代表JVM运行环境的Runtime类 要点
①某个类只能有一个实例。 构造器私有化。 ②这个类必须自行创建这个实例。 含有一个该类的静态变量来保存这个唯一的实例。 ③这个类必须自行向整个系统提供这个实例。 对外提供获取该实例的方式 直接暴露用静态变量的get方法获取 饿汉式
饿汉式直接创建对象不存在线程安全问题。(在类初始化时直接创建对象不管你是否需要这个对象都会创建)实现方式 直接实例化饿汉式简洁明了枚举式最简洁静态代码块饿汉式适合复杂实例化 直接实例化
//Singleton:单例设计模式软件开发中常见的设计模式之一//单例设计模式——饿汉式1直接实例化饿汉式
/** 1.构造器私有化* 2.自行创建并且用静态变量保存* 3.向外提供这个实例* 4.使用final修饰强调这是一个单例*/
public class Singleton_hungry1 {//直接实例化private static final Singleton_hungry1 INSTANCE new Singleton_hungry1();//构造器私有化private Singleton_hungry1(){}}枚举式
/*** 枚举类型表示该类型的变量是有限的几个* 我们可以限定为一个从而成了单例**/
public enum Singleton_hungry2 {//枚举类型的实例INSTANCE;private Singleton_hungry2() {}
}静态代码块
public class Singleton_hungry3 {public static final Singleton_hungry3 INSTANCE;static {//复杂情况在静态代码块中解决INSTANCE new Singleton_hungry3();}private Singleton_hungry3() {}
}懒汉式
懒汉式延迟创建对象。实现方式线程不安全适用于单线程线程安全适用于多线程静态内部类形式适用于多线程
线程不安全
/** 懒汉式延迟创建这个实例对象* 1. 构造器私有化* 2.用一个静态变量保存唯一实例* 3.提供一个静态方法用于获取实例*/
public class Singleton4 {private static Singleton4 instance;private Singleton4() {}//线程不安全public static Singleton4 getInstance() {if(instance null) {instance new Singleton4();}return instance;}}线程安全
public class Singleton5 {private static Singleton5 instance;private Singleton5() {}public static Singleton5 getInstance() {//上锁、线程安全synchronized(Singleton5.class){if(instance null) {instance new Singleton5();}}return instance;}} 静态内部类形式
/** 懒汉式延迟创建这个实例对象* 1. 构造器私有化* 2.用一个静态变量保存唯一实例* 3.提供一个静态方法用于获取实例*/
public class Singleton6 {private Singleton6() {}//内部类:静态内部类不会随着外部类的加载和初始化而初始化它是要单独去加载和初始化的//唯一实例因为是在内部类加载和初始化时才创建的所以线程安全private static class inner{//唯一实例: 在内部类被加载和初始化时才被创建private static Singleton6 instance new Singleton6();}public static Singleton6 getInstance() {return inner.instance;}}