当前位置: 首页 > news >正文

手机网站发展软件设计要求

手机网站发展,软件设计要求,yw27777最新跳转接口,wordpress媒体库代码文章目录 引言什么是单例模式单例模式的应用场景单例模式的优缺点优点缺点 单例模式的基本实现饿汉式单例模式懒汉式单例模式双重检查锁定静态内部类枚举单例 单例模式的线程安全问题多线程环境下的单例模式线程安全的实现方式1. **懒汉式单例模式#xff08;线程不安全#… 文章目录 引言什么是单例模式单例模式的应用场景单例模式的优缺点优点缺点 单例模式的基本实现饿汉式单例模式懒汉式单例模式双重检查锁定静态内部类枚举单例 单例模式的线程安全问题多线程环境下的单例模式线程安全的实现方式1. **懒汉式单例模式线程不安全**2. **懒汉式单例模式线程安全使用同步方法**3. **双重检查锁定**4. **静态内部类**5. **枚举单例** 单例模式的序列化与反序列化序列化导致的问题如何防止反序列化破坏单例 单例模式的反射攻击反射攻击导致的问题如何防止反射破坏单例使用枚举类型防止反射和序列化攻击 单例模式的实际应用案例数据库连接池管理日志管理配置文件管理 总结单例模式的最佳实践单例模式的使用建议 引言 什么是单例模式 单例模式Singleton Pattern是一种创建型设计模式它确保一个类只有一个实例并提供一个全局访问点来访问该实例。单例模式通过控制实例化过程来避免创建多个实例从而节省资源并确保全局状态的一致性。 在 Java 中实现单例模式的核心思想是私有化构造方法并通过一个公共的静态方法来返回类的唯一实例。 单例模式的应用场景 单例模式适用于以下场景 资源管理器如线程池、数据库连接池等这些资源通常是重量级的频繁创建和销毁会带来性能开销因此需要一个全局唯一的实例来管理这些资源。配置管理应用程序的配置文件通常是全局唯一的使用单例模式可以确保配置的唯一性和一致性。日志记录器日志记录器在整个应用程序中通常是唯一的使用单例模式可以确保日志记录的统一性和线程安全性。缓存缓存数据通常需要全局唯一的实例来管理以便在不同的地方访问和修改缓存时保持一致性。 单例模式的优缺点 优点 控制实例数量确保一个类只有一个实例避免了实例的重复创建节省系统资源。全局访问点提供一个全局访问点使得访问该实例变得简单。延迟加载某些实现方式如懒汉式单例可以实现延迟加载即在需要时才创建实例从而提高系统性能。 缺点 不易扩展由于单例类的构造方法是私有的继承和扩展变得困难。隐藏依赖关系单例模式隐藏了类之间的依赖关系增加了代码的复杂性和维护难度。多线程问题在多线程环境下实现单例模式时需要考虑线程安全问题否则可能会创建多个实例。 单例模式的基本实现 饿汉式单例模式 饿汉式单例模式在类加载时就创建实例确保类在第一次引用时就已经实例化。 public class HungrySingleton {// 类加载时就创建实例private static final HungrySingleton instance new ();// 私有构造方法防止外部实例化private HungrySingleton() {}// 提供公共的静态方法获取实例public static HungrySingleton getInstance() {return instance;} }优点 实现简单。线程安全因为实例在类加载时就创建了。 缺点 如果实例占用资源较多且未被使用会造成资源浪费。 懒汉式单例模式 懒汉式单例模式在第一次需要使用实例时才创建避免了资源浪费。 public class LazySingleton {// 静态变量保存单例实例private static LazySingleton instance;// 私有构造方法防止外部实例化private LazySingleton() {}// 提供公共的静态方法获取实例public static LazySingleton getInstance() {if (instance null) {instance new LazySingleton();}return instance;} }优点 延迟加载只有在需要时才创建实例。 缺点 线程不安全多线程环境下可能会创建多个实例。 双重检查锁定 双重检查锁定在懒汉式单例模式的基础上使用同步块和双重检查机制来保证线程安全。 public class DoubleCheckedLockingSingleton {// volatile 确保 instance 的可见性和有序性private static volatile DoubleCheckedLockingSingleton instance;// 私有构造方法防止外部实例化private DoubleCheckedLockingSingleton() {}// 提供公共的静态方法获取实例public static DoubleCheckedLockingSingleton getInstance() {if (instance null) {synchronized (DoubleCheckedLockingSingleton.class) {if (instance null) {instance new DoubleCheckedLockingSingleton();}}}return instance;} }优点 线程安全。延迟加载性能较好。 缺点 实现较为复杂需要理解 volatile 关键字和双重检查机制。 静态内部类 静态内部类方式利用 JVM 类加载机制来保证线程安全同时实现延迟加载。 public class StaticInnerClassSingleton {// 私有构造方法防止外部实例化private StaticInnerClassSingleton() {}// 静态内部类private static class SingletonHolder {private static final StaticInnerClassSingleton INSTANCE new StaticInnerClassSingleton();}// 提供公共的静态方法获取实例public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;} }优点 线程安全。延迟加载。实现简单利用 JVM 的类加载机制避免了同步开销。 缺点 无法提前创建实例。 枚举单例 枚举单例利用枚举类型本身的特性来保证单例模式的实现是最简单且最安全的实现方式。 public enum EnumSingleton {INSTANCE;// 可以添加其他方法public void someMethod() {// 方法实现} }优点 线程安全。防止反序列化破坏单例。防止反射攻击。 缺点 无法实现延迟加载但通常不需要因为 JVM 保证枚举类的唯一性。 单例模式的线程安全问题 多线程环境下的单例模式 在多线程环境中单例模式的实现需要特别注意线程安全问题。多个线程同时访问单例类的实例获取方法时可能会导致创建多个实例违背单例模式的初衷。为了确保单例模式在多线程环境下的正确性需要采取一些措施来保证线程安全。 线程安全的实现方式 1. 懒汉式单例模式线程不安全 最简单的懒汉式单例实现并没有考虑线程安全在多线程环境下可能会创建多个实例。 public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static LazySingleton getInstance() {if (instance null) {instance new LazySingleton();}return instance;} }2. 懒汉式单例模式线程安全使用同步方法 通过在 getInstance 方法上加 synchronized 关键字确保每次只有一个线程能够执行该方法从而保证线程安全。 public class SynchronizedLazySingleton {private static SynchronizedLazySingleton instance;private SynchronizedLazySingleton() {}public static synchronized SynchronizedLazySingleton getInstance() {if (instance null) {instance new SynchronizedLazySingleton();}return instance;} }优点 简单易实现。线程安全。 缺点 每次调用 getInstance 方法时都需要进行同步性能开销较大。 3. 双重检查锁定 双重检查锁定在第一次检查实例是否为 null 时不加锁只有在实例为 null 时才进行同步操作从而减少了同步开销。 public class DoubleCheckedLockingSingleton {private static volatile DoubleCheckedLockingSingleton instance;private DoubleCheckedLockingSingleton() {}public static DoubleCheckedLockingSingleton getInstance() {if (instance null) {synchronized (DoubleCheckedLockingSingleton.class) {if (instance null) {instance new DoubleCheckedLockingSingleton();}}}return instance;} }优点 线程安全。相比同步方法性能更高。 缺点 实现复杂需要注意 volatile 关键字的使用。 4. 静态内部类 利用 Java 的类加载机制静态内部类在被调用时才会被加载从而实现延迟加载和线程安全。 public class StaticInnerClassSingleton {private StaticInnerClassSingleton() {}private static class SingletonHolder {private static final StaticInnerClassSingleton INSTANCE new StaticInnerClassSingleton();}public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;} }优点 线程安全。实现简单延迟加载。 缺点 无法防止反射攻击。 5. 枚举单例 枚举类型本身是线程安全的并且枚举的实例是全局唯一的可以防止反射和序列化导致的重新创建实例问题。 public enum EnumSingleton {INSTANCE;public void someMethod() {// some method} }优点 线程安全。防止反射和序列化导致的重新创建实例问题。 缺点 枚举类型在某些情况下可能不适用例如需要继承其他类。 单例模式的序列化与反序列化 序列化导致的问题 在 Java 中单例模式可能会由于序列化和反序列化而被破坏。具体来说当一个单例对象被序列化到文件中然后再从文件中反序列化回来时会创建一个新的实例这样就违反了单例模式的原则。 例如考虑以下单例类 import java.io.Serializable;public class Singleton implements Serializable {private static final long serialVersionUID 1L;private static final Singleton instance new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;} }如果我们进行序列化和反序列化操作 import java.io.*;public class SingletonSerializationTest {public static void main(String[] args) throws Exception {Singleton instanceOne Singleton.getInstance();// 序列化对象到文件ObjectOutputStream out new ObjectOutputStream(new FileOutputStream(singleton.ser));out.writeObject(instanceOne);out.close();// 从文件中反序列化对象ObjectInputStream in new ObjectInputStream(new FileInputStream(singleton.ser));Singleton instanceTwo (Singleton) in.readObject();in.close();System.out.println(instanceOne hashCode: instanceOne.hashCode());System.out.println(instanceTwo hashCode: instanceTwo.hashCode());} }输出可能会是两个不同的哈希码表明反序列化创建了一个新的实例。 如何防止反序列化破坏单例 为了防止反序列化破坏单例可以在单例类中实现 readResolve 方法。这个方法在反序列化时会被自动调用返回当前的单例实例从而确保反序列化不会创建新的实例。 import java.io.Serializable;public class Singleton implements Serializable {private static final long serialVersionUID 1L;private static final Singleton instance new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}// 添加 readResolve 方法protected Object readResolve() {return getInstance();} }现在如果我们再次运行序列化和反序列化操作输出将会是相同的哈希码表明反序列化没有创建新的实例 import java.io.*;public class SingletonSerializationTest {public static void main(String[] args) throws Exception {Singleton instanceOne Singleton.getInstance();// 序列化对象到文件ObjectOutputStream out new ObjectOutputStream(new FileOutputStream(singleton.ser));out.writeObject(instanceOne);out.close();// 从文件中反序列化对象ObjectInputStream in new ObjectInputStream(new FileInputStream(singleton.ser));Singleton instanceTwo (Singleton) in.readObject();in.close();System.out.println(instanceOne hashCode: instanceOne.hashCode());System.out.println(instanceTwo hashCode: instanceTwo.hashCode());} }通过实现 readResolve 方法可以确保序列化和反序列化过程中不会破坏单例模式从而维护单例的唯一性。 单例模式的反射攻击 反射攻击导致的问题 Java 的反射机制允许在运行时动态地创建对象、调用方法和访问字段。通过反射可以绕过私有构造函数直接创建单例类的新实例从而破坏单例模式。 例如考虑以下单例类 public class Singleton {private static final Singleton instance new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;} }使用反射可以创建新的实例 Singleton instance1 Singleton.getInstance();ConstructorSingleton constructor Singleton.class.getDeclaredConstructor(); constructor.setAccessible(true); Singleton instance2 constructor.newInstance();System.out.println(instance1 instance2); // 输出 false如何防止反射破坏单例 为了防止反射攻击可以在单例类的构造函数中加入防御措施确保在构造函数被多次调用时抛出异常。 public class Singleton {private static final Singleton instance new Singleton();private static boolean instanceCreated false;private Singleton() {if (instanceCreated) {throw new RuntimeException(单例实例已经存在不能创建多个实例);}instanceCreated true;}public static Singleton getInstance() {return instance;} }在上述代码中instanceCreated 标志用于检测是否已经创建过实例。如果构造函数被再次调用则抛出异常防止通过反射创建新的实例。 使用枚举类型防止反射和序列化攻击 使用枚举类型实现单例模式是防止反射和序列化攻击的最简单和最有效的方法。枚举类型在 Java 中是天然的单例并且防止反射攻击和序列化攻击。 public enum EnumSingleton {INSTANCE;public void someMethod() {// some method} }枚举类型的单例不仅简单而且可以防止反射和序列化导致的单例破坏问题。 单例模式的实际应用案例 数据库连接池管理 数据库连接池是一个典型的单例模式应用场景。通过单例模式确保整个应用程序只存在一个数据库连接池实例从而有效管理数据库连接资源。 public class DatabaseConnectionPool {private static DatabaseConnectionPool instance;private ConnectionPool pool;private DatabaseConnectionPool() {// 初始化连接池}public static synchronized DatabaseConnectionPool getInstance() {if (instance null) {instance new DatabaseConnectionPool();}return instance;}public Connection getConnection() {return pool.getConnection();} }日志管理 日志管理也是单例模式的一个常见应用。通过单例模式确保整个应用程序使用同一个日志记录器实例从而统一管理日志输出。 public class Logger {private static Logger instance;private Logger() {// 初始化日志配置}public static synchronized Logger getInstance() {if (instance null) {instance new Logger();}return instance;}public void log(String message) {// 记录日志} }配置文件管理 配置文件管理通常也使用单例模式确保整个应用程序只加载一次配置文件并提供统一的接口访问配置数据。 public class ConfigurationManager {private static ConfigurationManager instance;private Properties properties;private ConfigurationManager() {// 加载配置文件properties new Properties();try (InputStream input new FileInputStream(config.properties)) {properties.load(input);} catch (IOException ex) {ex.printStackTrace();}}public static synchronized ConfigurationManager getInstance() {if (instance null) {instance new ConfigurationManager();}return instance;}public String getProperty(String key) {return properties.getProperty(key);} }总结 单例模式的最佳实践 私有构造函数确保构造函数是私有的防止外部直接实例化。静态方法获取实例通过静态方法获取唯一的实例。防止反射攻击在构造函数中添加检查防止反射攻击。防止序列化破坏实现 readResolve 方法防止反序列化创建新的实例。线程安全在多线程环境中使用合适的方式如双重检查锁定、静态内部类、枚举单例确保线程安全。 单例模式的使用建议 资源管理适用于需要全局管理的资源如数据库连接池、日志记录器、配置文件等。性能考虑在性能敏感的应用中确保单例的创建和访问是高效的。避免过度使用虽然单例模式有其优势但过度使用可能导致代码难以测试和维护。在设计时应慎重考虑是否真的需要单例模式。测试友好在单元测试中可以使用依赖注入或其他设计模式来替代单例以便于测试。 通过遵循这些最佳实践和使用建议可以在项目中有效地应用单例模式确保其稳定性和可维护性。
http://www.dnsts.com.cn/news/38958.html

相关文章:

  • 专业建设网站的公司wordpress文章右边自定义字段
  • 网站服务器在哪租电脑在哪里制作网站
  • intitle:网站建设如何把自己做的网站放到微信上
  • 千助网站建设关于网站建设的方案ppt
  • 如何在网站上添加qqapp首页界面设计
  • 专业网站设计学校网络推广工作描述
  • 做苗木生意上什么网站做网站公司费用
  • 高品质的网站开发公司网站策划与维护
  • 外贸网站商城建设网站建设分为那几个模块
  • wamp做的网站外网怎么访问不了杭州网络营销公司
  • 网站效果图模板软件专业做学校网站论文怎么选题
  • 石家庄网站建设时光旅游网站开发实验报告
  • 卖汽车配件怎么做网站wordpress 附件上传插件下载失败
  • 网站站点建设的端口成立一家公司的基本流程
  • 虚拟主机空间发布网站网站建实例
  • 哪些网站可以做网店网页翻译器在线翻译
  • c#做的网站怎么上传图片网站开发流程有哪些
  • 做图素材网站wordpress tdk
  • 一个网站备案多个域名吗网站建设及管理工作岗位要求
  • 西樵建网站检查网站是否做网站地图
  • 深圳网站设计吧迅驰互联网站建设网络推广怎么样
  • 网络彩票的网站怎么做腾讯邮箱网页版登录入口
  • 网站域名管理在哪里路由器做网站80端口
  • 关于网站开发的一些论文wordpress怎样上传
  • 怎么把自己做的网站登录到网上网站设计公司 无锡
  • 家具网站建设策划方案300个吉祥公司取名大全
  • 如何利用NAS做网站温州网站专业制作
  • 网站开发设计大赛东莞营销型高端网站建设
  • 外贸网站 源wordpress v2ex主题
  • 好网站建设公司哪里好鹤壁网络推广公司