单例模式
就是始终是一个对象实例.它对外不提供构造函数,因此我们不能够同时产生多个对象.(常用语工具类,数据库连接类等等)
单例模式的调用:因为单例模式的构造方法是私有的,所以在其他类中我们是没有办法直接实例化它的.但是又因为她对外提供了一个获取类实例的方法,所以不论有多少类调用,他对外只可能产生一个类的实例
在People类中;创建静态私有对象p;创建getInstance()方法来返回对象p;其他类可以直接调用getInstance()方法获取对象p。
线程不安全:
1.饿汉单例模式
public class People{
private static People p = new People();
private People(){
}
public static People getInstance(){
return p;
}
}
2.懒汉单例模式
public class People{
private static People p;
private People(){
}
public static People getInstance(){
if(p == null){
p = new People();
}
return p;
}
}
好处:减少系统资源的消耗.因为这种工具类基本上贯穿程序始终,必然会频繁调用.如果每一次调用都要重新生成实例,带来的就是 在内存堆中,分配一部分内存空间.所以这种模式会提高程序的运行速度,减少资源消耗
3.利用枚举实现线程安全并且JVM安全的单例模式
// 线程安全,JVM安全的单例类 enum Singleton{ SINGLE } // 单例类的使用 class Test{ public static void main(String[] args) { Singleton s1 = Singleton.SINGLE; Singleton s2 = Singleton.SINGLE; Singleton s3 = Singleton.SINGLE; } }
4.用内部类实现线程安全的单例模式
class Singleton{ //02 定义一个静态内部类 private static class InnerClass{ static Singleton singleton=new Singleton(); } //03 public static Singleton getsingleton(){ return InnerClass.singleton; } //01 private Singleton(){ System.out.println("call Singleton()"); } }