(21)有些类也需计划生育——单例模式
最后更新于:2022-04-01 14:30:49
### 单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。(摘抄)
解决的问题:保证一个类在内存中的对象唯一性。
比如:多程序读取一个配置文件时,建议配置文件封装成对象。会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的。
~~~
public class Singleton
{
private Singleton(){}
private static Singleton singleton;
public static Singleton getSingleton()
{
if (singleton == null)
{
singleton = new Singleton();
}
return singleton;
}
}
class Client
{
public static void main()
{
Singleton singleton1 = Singleton.getSingleton();
Singleton singleton2 = Singleton.getSingleton();
if (singleton1 == singleton2)
{
System.out.println("yes");
}
else
{
System.out.println("no");
}
}
}
~~~
上面这种单例模式的类加载方式被称为懒汉式(延迟加载方式)
下面这种为饿汉式
~~~
public class Singleton
{
private Singleton(){}
private static Singleton singleton = new Singleton();
public static Singleton getSingleton()
{
return singleton;
}
}
~~~
饿汉式在多线程时不会重复生成实例,因为静态初始化让它在程序加载的时候已经生成实例了,懒汉式如果要在多线程时也不出问题,那么需要双重锁定
~~~
public class Singleton
{
private Singleton(){}
private static Singleton singleton;
public static Singleton getSingleton()
{
if (singleton == null)
{
synchronized (Singleton.class)
{
if (singleton == null)
{
singleton = new Singleton();
}
}
}
return singleton;
}
}
~~~
这样懒汉式也可以在多线程时调用了。