设计模式--单例模式
为什么要有单例设计模式?
单例设计模式:保证类在内存中只有一个对象(一般我们在定义类后,可以创建多个想象,单例设计模式保证了类只创建一个对象)
单例模式主要是为了避免因为创建了多个实例造成资源的浪费,且多个实例由于多次调用容易导致结果出现错误,而使用单例模式能够保证整个应用中有且只有一个实例。
//单例模式--饿汉式实现
package exemple;
public class TestSingleton {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if(s1==s2) {
System.out.println("true");
}
System.out.println(s1);
System.out.println(s2);
}
}
class Singleton{
//设计单例模式,使得创建的类只能创建一个对象
//1、首先私有化该类构造方法,使得其他类不能new该类
private Singleton() {}
/**
* 饿汉式,牺牲空间换取时间
*
*/
//2、创建私有化该类对象,先创建对象
private static Singleton s = new Singleton();
//3、定义公共方法,可以的到该类调用方法
public static Singleton getInstance() {
return s;
}
}
验证懒汉式模式出现的线程不安全情况:
怎样导致这种问题的?
在运行过程中可能存在这么一种情况:有多个线程去调用getInstance方法来获取Singleton的实例,那么就有可能发生这样一种情况当第一个线程在执行if(instance==null)这个语句时,此时instance是为null的进入语句。在还没有执行instance=new Singleton()时(此时instance是为null的)第二个线程也进入if(instance==null)这个语句,因为之前进入这个语句的线程中还没有执行instance=new Singleton(),所以它会执行instance=new Singleton()来实例化Singleton对象,因为第二个线程也进入了if语句所以它也会实例化Singleton对象。这样就导致了实例化了两个Singleton对象。
package exemple;
//懒汉式单例设计模式
public class LSingleton extends Thread{
public static void main(String[] args) {
new LSingleton().start();
new LSingleton().start();
}
public void run() {
Singleton1 s1 = Singleton1.getInstance();
Singleton1 s2 = Singleton1.getInstance();
System.out.println(s1);
System.out.println(s2);
System.out.println(s1 == s2);
}
}
/*
* 懒汉式单例模式,会出现线程不安全情况
* 懒汉式--牺牲时间换区空间
*/
class Singleton1{
private static Singleton1 instance = null;
private Singleton1() {
};
public static Singleton1 getInstance() {
if (instance == null) {
instance = new Singleton1();
}
return instance;
}
}
第一次执行时,当多线程调用单例模式,没有出现线程不安全现象:
多线程多次调用后出现线程不安全现象: