专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java设计模式(十八):单例模式(java的单例设计模式)

temp10 2024-09-22 10:00:50 java教程 8 ℃ 0 评论

单例模式(singleton pattern)

单例模式(singleton pattern):属于对象的创建型模式。保证一个类仅有一个实例,并提供一个访问它的全局访问点。


单例模式UML图

Java设计模式(十八):单例模式(java的单例设计模式)

Java


单例模式特点

  • 单例类只能实例化一次。

  • 单例类需要自己创建自己的唯一实例。

  • 单例类需要提供一个给其它对象访问该唯一实例的方法。


示例代码

饿汉式单例模式

Java

如上示例中,当类第一次加载时就会初始化静态变量 instance ,此时就会调用类的私有构造器,这时就创建出了单例类的唯一实例。饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间。

懒汉式单例模式

Java

如上示例中,当单例类加载时不会立刻创建对象的实例,而是在调用类的静态工厂方法时才创建对象的唯一实例,我们在获取实例的静态方法中使用了锁,这样做的目的是防止在多线程环境下多个对象同时调用静态工厂方法时出现并发问题。懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。

双重检查加锁

Java

如上示例使用了“双重检查加锁”的方式实现,既实现线程安全,又能够使性能不受很大的影响。所谓“双重检查加锁”机制,指的是:并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法后,先检查实例是否存在,如果不存在才进行下面的同步块,这是第一重检查,进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了多次在同步情况下进行判断所浪费的时间。

Lazy initialization holder class模式

Java

如上示例中,当getInstance方法第一次被调用的时候,它第一次读取SingletonHolder.instance,导致 SingletonHolder 类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静态域,从而创建 LazyHolderSingleton 的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。

单例和枚举

Java

使用枚举来实现单实例控制会更加简洁,而且无偿地提供了序列化机制,并由JVM从根本上提供保障,绝对防止多次实例化,是更简洁、高效、安全的实现单例的方式。

客户端测试类

Java

Java学习资料获取(复制下段连接至浏览器即可)

data:text/html;charset=UTF-8;base64,5p625p6E5biI5a2m5Lmg6LWE5paZ5YWN6LS56aKG5Y+W6K+35Yqg5omj5omj5Y+35pivMTAxODkyNTc4MA==

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表