单例作用
- 1 节省内存
- 2 可以避免多种状态导致状态冲突
单例的创建步骤
- 1 私有化构造方法
- 2 私有化声明的属性
- 3 getInstance
- 4 方法需要静态
单例分类
1.懒汉式
2.饿汉式
两种单例区别:
饿汉式 线程安全的
懒汉式 线程不安全的
饿汉式:
package 设计模式之单例;
//饿汉式:
public class HungeryMode {private final static HungeryMode INSTANCE=new HungeryMode();public static HungeryMode getInstance() {return INSTANCE;}private HungeryMode(){}}
懒汉式:
package 设计模式之单例;public class LazyMode {private static LazyMode instance=null;public static LazyMode getInstance() {if(instance==null){instance=new LazyMode();}return instance;}private LazyMode(){}
}
测试:
package 设计模式之单例;public class Test1 {public static void main(String[] args){//饿汉式 HungeryMode instance=HungeryMode.getInstance();HungeryMode instance2=HungeryMode.getInstance();System.out.println("instance="+instance);System.out.println("instance2="+instance2);// 懒汉式LazyMode instance3=LazyMode.getInstance();LazyMode instance4=LazyMode.getInstance();LazyMode instance5=LazyMode.getInstance();System.out.println("instance3="+instance3+","+instance3.hashCode());System.out.println("instance4="+instance4+","+instance4.hashCode());System.out.println("instance5="+instance5+","+instance5.hashCode());}
}
测试结果:
创建多个对象,测试内存地址,如果相同说明创建的是同一个对象,说明创建的是单例!
延伸—————————–懒汉式线程安全性处理————————–
懒汉式线程不安全原因:
在多线程中,创建单例时,可能出现多个线程进入if(instance==null)执行语句中,在一个线程创建了一个instance后,其他进入执行语句的线程也会接着创建,这样就会产生多个对象,实现不了单例了,此时不安全了。
代码:
package 设计模式之单例;public class LazyMode2 {private static LazyMode2 instance=null;private LazyMode2(){}public static LazyMode2 getInstance(){// 双重检查if(instance==null){// 为了提高效率 尽可能少的让线程反复判断锁synchronized (LazyMode2.class) {// 静态方法中 不能使用this 就可以用 本类.class 来代替if(instance==null){instance=new LazyMode2();}}}return instance;}
}