单例模式的特点:
1.单例类只能有一个对象(实例)。
2.单例类必须自己创建自己的唯一实例 。
3.单例类必须给所有其他对象提供这一实例。
设置步骤:
1.将对象的应用成员变量用private来修饰。
2.保证对象的唯一性。
3.提供一个静态方法接收唯一的对象。
4.把构造方法设置为私有方法,防止new一个对象。
常用的有:懒汉式单例和饿汉式单例。
一:懒汉式单例
class Singleton { //声明本类的引用变量,不创建 private static Singleton s = null; //私有化一个构造方法 private Singleton () {}; //提供一个静态的方法来接收唯一的对象 public static Singleton getInstance(){ if(s==null){ s = new Singleton(); } return s; } }
二:饿汉式单例
class Singleton1{ //保证对象唯一 // 声明本类的引用变量, 并且把对象创建出来 private static final Singleton1 s1 = new Singleton1(); // 静态的成员变量 //私有化构造方法 ,防止通过new来创建对象 private Singleton1(){} //提供一个静态方法来接收唯一的对象 public static Singleton1 getInstance (){ return s; } }
懒汉式与饿汉式的区别:
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,
而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
1.线程安全:
饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,
懒汉式本身是非线程安全的,实现在资源加载和性能方面有些区别。
2.资源加载和性能:
饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用 时速度也会更快,因为其资源已经初始化完成。
而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。
线程安全是什么:
就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问
什么是线程安全:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。