目录
一.引言
在计算机领域中存在许多设计模式,各本书上都没有对总共有几种有明确的定义,所以我们一般称设计模式有n种,而单例模式是其中一种,本篇文章将会为大家介绍以下单例模式的写法。
二.单例模式
单例模式能保证某个类在程序中只存在唯⼀⼀份实例, ⽽不会创建出多个实例。
三.实现方式
3.1饿汉模式
在类加载的同时,创建实例。
class Singleton{
private static Singleton instance=new Singleton();
public static Singleton getInstance(){
return instance;
}
private Singleton(){
}
}
3.2懒汉模式
类加载的时候不创建实例,第一次使用的时候才创建实例。
class SingletonLazy{
private static SingletonLazy instance=null;
public static SingletonLazy getInstance(){
if(instance==null){
instance=new SingletonLazy();
}
return instance;
}
private SingletonLazy(){
}
}
四.线程安全问题
由上面的代码,我们可以知道,在懒汉模式情况下,如果多个线程同时调用getInstance()方法,可能会创建出多个实例。这就导致了线程不安全。所以我们在这里需要给懒汉模式加上锁。
class SingletonLazy{
private static volatile SingletonLazy instance=null;
public static SingletonLazy getInstance(){
if(instance==null){
synchronized (SingletonLazy.class){
if(instance==null){
instance=new SingletonLazy();
}
}
}
return instance;
}
private SingletonLazy(){
}
}
加锁/解锁操作是一件开销比较高的事情,而懒汉模式的线程不安全只是发生在首次创建实例的时候,因此后续使用的时候,不必再进行加锁了。
所以代码中的第一个if就是判断instance的实例是否已经创建出。
同时为了避免“内存可见性”导致读取的instance出现偏差,于是补充上volatile。
五.总结
本篇文章简单地介绍了以下单例模式中懒汉模式以及饿汉模式的写法以及他们的区别以及他们的线程不安全的原因和解决方法。欢迎各位在评论区进行讨论,感谢观看!