定义:确保一个类只有一个实例,并提供一个全局访问点。
类图:
优点
- 在内存中只有一个对象,节省内存空间。
- 避免频繁的创建销毁对象,可以提高性能。
- 避免对共享资源的多重占用。
- 可以全局访问。
- 延迟实例化。
一个单例模式(懒汉式)
public class Singleton { private static Singleton uniqueInstance; private Singleton(){} public static Singleton getInstance(){ if(uniqueInstance == null){ uniqueInstance = new Singleton(); } return uniqueInstance; } }
上述代码是一个单例的实现,但是如果在两个或多个线程中都要执行这段代码,会出现什么情况呢?
在java的线程中。往往会先实例化一个对象然后将这对象交给一个Thread类的对象去构造。所以解决的办法可以控制getInstance()方法内的操作次序和uniqueInstance的值,引入同步(synchronized)方法。
public class Singleton { private static Singleton uniqueInstance; private Singleton(){} public static synchronized Singleton getInstance(){ if(uniqueInstance == null){ uniqueInstance = new Singleton(); } return uniqueInstance; } }
上面的代码虽解决了线程的问题但该种方法会导致性能降低。所以进而加入双重检查加锁,首先会检查是否实例已经创建,如果未创建,才进行同步。
public class Singleton { private volatile static Singleton uniqueInstance; private Singleton(){} public static Singleton getUniqueInstance(){ if(uniqueInstance == null){ synchronized (Singleton.class){ uniqueInstance = new Singleton(); } } return uniqueInstance; } }
下面列一个饿汉式的单例模式
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
单例模式的应用场景:我觉得是一个类需要经常创建和销毁。
在使用单例模式的时候需要注意线程安全的问题。