设计模式:之前别人总结的一套解决特定问题的较优代码。
单例设计模式:
1.作用:
在应用程序中保证最多只能有一个实例。
2.好处:
2.1
提升运行效率(就一个对象,当再次使用该对象时,就不用再去new了,即不用再次重新进行类加载过程,把该对象的地址取到就行了)
2.2
可以实现数据共享(示例:application对象,该对象的有效范围:从tomcat开启到关闭,当使用setAttribute(key,value)设置一个数据时,该数据就一直处于共享状态,通getAttribute(key)来获取,application对象在tomcat启动时创建,可以通过getServletContext()来获取)
3.懒汉式
3.1 对象只有被调用时才去创建
3.2 示例代码
package singleton;
/**
* 懒汉式:对象只有被调用时才去创建对象
* @author YJL
*/
public class LazySingleTon {
/**
* 由于属性需要被静态方法调用,则把属性设置为static
*/
private static LazySingleTon singleTon;
/**
* 1.构造方法特点:
* 方法名和类名相同
* 无返回值
* 2.构造器私有化:
* 是为了其它类不能实例化这个类对象
* 3.为了可以获取该对象
* 则由必须对外提供访问入口(即下面的getInstance()方法)
*/
private LazySingleTon() {
}
/**
* 因为实例方法必须通过对象调用,而现在构造器是private,
* 不能在外部通过new来创建对象了
*
* 则用类方法(即加上static)
* @return
*/
public static LazySingleTon getInstance() {
//添加逻辑如果实例化过了,就直接返回
if(singleTon == null) {
/**
* 多线程访问下,可能出现if同时成立的情况,所以添加锁
* 一加了锁,就表示要排队
* 如果不加锁,就会线程不安全,
* 加锁后效率就会相对低
*/
synchronized (LazySingleTon.class) {
//双重验证
if(singleTon==null){
singleTon = new LazySingleTon();
}
}
}
return singleTon;
}
}
3.3测试代码:
package singleton;
public class Test {
public static void main(String[] args) {
LazySingleTon s1 = LazySingleTon.getInstance();
LazySingleTon s2 = LazySingleTon.getInstance();
System.out.println(s1==s2);
}
}
结果为true.
3.4:
因为懒汉式代码中添加了锁,导致效率低。
4.饿汉式
4.1:
解决了懒汉式中多线程访问可能出现同一个对象和效率低的问题
4.2 示例代码
package singleton;
public class HungrySingleTon {
/**
* 在类加载时进行实例化
*/
private static HungrySingleTon singleTon2 = new HungrySingleTon();
private HungrySingleTon() {
}
public static HungrySingleTon getInstance() {
return singleTon2;
}
}
4.3 :
相对于懒汉式,饿汉式线程安全,效率高,但也相对浪费空间,因为不管是否调用都进行了实例化(加载类的时候就实例化了),而懒汉式则什么时候调用就什么时候实例化对象。