一、单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。所谓单例就是在系统中只有一个该类的实例,或者说类只能被创建一次。
二、详解饿汉式、懒汉式
饿汉式
1.创建一个类 然后对类里面的构造器进行私有化 目的:防止外面调用该类创建对象 无法实现单例
2.一开始先创建一个静态对象 目的:这个对象就是单例
3.创建一个pubilc静态方法来返回对象,供外面调用该对象
代码如下:
public class SingleInstance {
public static SingleInstance singleInstance = new SingleInstance();
private SingleInstance() {
}
public static void main(String[] args) {
SingleInstance s1 = SingleInstance.singleInstance;
SingleInstance s2 = SingleInstance.singleInstance;
System.out.println(s1 == s2);
}
}
说明这个两个对象是一样的。
以上就是饿汉式的单例模式 :
优点:线程安全的
不足:一开始就创建对象容易造成空间浪费
懒汉式:
1.创建一个类 并将构造器设置为私有的 目的:防止外面的对象去调用 无法弄成单例模式
2.声明一个静态对象但是没有初始化等到要使用的时候再去初始化对象避免占用内存空间
3.提供一个public static方法供外面调用
代码如下:
public class LazyMan {
private LazyMan() {
}
private static LazyMan lazyMan;
public static LazyMan getInstance() {
if (lazyMan == null) {
lazyMan = new LazyMan();
}
return lazyMan;
}
public static void main(String[] args) {
LazyMan l1 = LazyMan.getInstance();
LazyMan l2 = LazyMan.getInstance();
System.out.println(l1 == l2);
}
}
上面就是懒汉式的单例模式
优点:避免内存空间浪费
不足:线程不安全当多个线程同时调用的时候方法内部可能会发生阻塞造成线程不安全
下面我们写一个线程安全的懒汉式模式:
public class LazyMan {
private LazyMan() {
}
private static LazyMan lazyMan;
public static synchronized LazyMan getInstance() {
if (lazyMan == null) {
lazyMan = new LazyMan();
}
return lazyMan;
}
public static void main(String[] args) {
LazyMan l1 = LazyMan.getInstance();
LazyMan l2 = LazyMan.getInstance();
System.out.println(l1 == l2);
}
}
懒汉式单例的线程安全否在于获取实例时是否加了锁,防止多个线程同时通过getInstance方法获取实例。