设计模式--单例模式

为什么要有单例设计模式?

单例设计模式:保证类在内存中只有一个对象(一般我们在定义类后,可以创建多个想象,单例设计模式保证了类只创建一个对象)

单例模式主要是为了避免因为创建了多个实例造成资源的浪费,且多个实例由于多次调用容易导致结果出现错误,而使用单例模式能够保证整个应用中有且只有一个实例。

//单例模式--饿汉式实现
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;
	}
}

第一次执行时,当多线程调用单例模式,没有出现线程不安全现象:

多线程多次调用后出现线程不安全现象:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值