单例模式最大的特点就是只创建一次对象
,对于那种重量级的对象来说,只创建一次可以减少系统的开销,并且能够减少对象的数量,减少GC
的压力。
单例模式主要用在spring
的bean
的作用域。
单例模式分为**懒汉式和饿汉式
**。
区别在于:
- 懒汉式比较懒,只有在用到对象的时候才会创建;饿汉式比较饿,所以会提前创建好一个对象,等到调用的时候直接返回。
- 线程安全方面,懒汉式线程不安全,需要使用同步机制保证线程安全;饿汉式是天生安全的
代码体现:
懒汉式:
package com.review.singleton;
/**
* 懒汉式单例,只有在用到的时候才会new一个实例
*/
public class Singleton {
private Singleton(){}
private static Singleton singleton = null;
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
/**
* 保证了线程安全,但是效率不高
* @return
*/
public static synchronized Singleton getInstance1(){
if (singleton == null){
singleton = new Singleton();
}
return singleton;
}
/**
* 此时需要把singleton设置为volatile变量,禁止指令进行重排序
* 注意判断两次是否为空的作用:两个线程A,B先做第一次判断,singleton为空所以开始竞争锁;假如线程A
* 先抢到了锁并new了一个对象,那么B再获取到锁的时候就不需要重新new了,保证了是单例的
* @return
*/
public static Singleton getInstance2(){
if (singleton == null){
synchronized (Singleton.class){
if (singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
饿汉式:
package com.review.singleton;
/**
* 饿汉式单例模式,直接提前创建好对象,用的时候直接返回
*/
public class Singleton1 {
private Singleton1(){}
private static Singleton1 singleton1 = new Singleton1();
public static Singleton1 getInstance(){
return singleton1;
}
}