概述:
保证一个类仅有一个对象,并提供一个访问它的全局访问点。当系统需要某个类只能有一个实例时,就可以采用单例模式。
特点:单例类只有一个实例;单例类必须自己创建自己唯一的实例;单例类必须给其他所有对象
单例模式的实现方式。
1,直接实例化。
public class singleton{
private singleton(){ };
private static final singleton single = new singleton();
public static singleton getInstance(){
return single;
}
}
2,延迟话实现
public static class Singleton2{
private Singleton2(){}
private static Singleton2 single = null;
public static Singleton2 getInstance(){
if(single == null){
single = new Singleton2();
}
return single;
}
}
延迟创建是线程不安全的,在多线程中可能会创建多个实例,所以需要改进。
1,完全同步方法
在原有的代码基础上的成员函数前面加上synchronized
public static synchronized Singleton2 getInstance()
2,部分同步方法
public static class Singleton2{
private Singleton2(){}
private static Singleton2 single = null;
public static Singleton2 getInstance(){
synchronized(Singleton2.class){
if(single == null) {
single = new Singleton2();
}
}
return single;
}
}
3,静态内部类
import java.lang.reflect.*;
import java.util.Scanner;
public class test {
public static class Singleton3{
private static class My{
private static final Singleton3 single = new Singleton3();
}
private Singleton3(){
System.out.println("this is a new instance!");
}
public static final Singleton3 getInstance(){
return My.single;
}
}
public static void main(String []args)throws Exception {
Scanner s = new Scanner(System.in);
s.next();
Singleton3 obj = Singleton3.getInstance();
Singleton3 obj2 = Singleton3.getInstance();
}
}
方法三与1,2相比最大的不同就是在于类中没有使用synchromized关键字,因而提高了java虚拟机的维护效率。它是通过静态内部类My来实现单例对象的。而且对象My.single是线程安全的。
应用场景:
由于以上两点可知单例模式的使用对于系统的关键组件和频繁使用的对象来说是可以有效的改善系统的性能的。
spring 的 bean 默认是单例模式的。
作者:hlchengzi
链接:https://www.jianshu.com/p/974c3f31f635
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。