定义:
确保一个类只有一个实例,并提供一个全局的访问点
与全局变量的区别:
全局变量必须在程序一开始就创建好对象,如果这个对象非常耗费资源,而程序在这次执行过程中又一直没有用到它,就形成资源浪费。而通过单例模式,我们可以在需要时再创建对象。(与JVM实现有关)
单例模式经典实现:
缺点:无法应对多线程
package singletonpattern;
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getUniqueInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
单例模式多线程实现1:
使用synchronized修饰方法,但是性能较低
package singletonpattern;
public class Singleton_1 {
private static Singleton_1 uniqueInstance;
private Singleton_1(){
}
public static synchronized Singleton_1 getUniqueInstance() {
if(uniqueInstance==null){
uniqueInstance=new Singleton_1();
}
return uniqueInstance;
}
}
单例模式多线程实现2:
双重加锁实现
package singletonpattern;
public class Singleton_2 {
private volatile static Singleton_2 uniqueInstance;
private Singleton_2(){};
public static Singleton_2 getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton_2.class) {
if (uniqueInstance == null)
uniqueInstance = new Singleton_2();
}
}
return uniqueInstance;
}
}